C# 静态代码织入AOP组件之肉夹馍

2024-01-15 01:04

本文主要是介绍C# 静态代码织入AOP组件之肉夹馍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面

关于肉夹馍组件的官方介绍说明:

Rougamo是一个静态代码织入的AOP组件,同为AOP组件较为常用的有Castle、Autofac、AspectCore等,与这些组件不同的是,这些组件基本都是通过动态代理+IoC的方式实现AOP,是运行时完成的,而Rougamo是编译时直接修改目标方法织入IL代码的。如果你还知道一个AOP组件"PostSharp",那么Rougamo就是类似Postsharp的一个组件,Postsharp是一个成熟稳定的静态代码织入组件,但PostSharp是一款商业软件,一些常用的功能在免费版本中并不提供。

老规矩从NuGet 安装组件 Rougamo.Fody

代码实现

以下是最基础的一个应用肉夹馍AOP组件的实现代码

 注入代码主体[LoggingAttribute]:

    public class LoggingAttribute : MoAttribute{private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();public override void OnEntry(MethodContext context){// 从context对象中能取到包括入参、类实例、方法描述等信息Logger.Info("方法执行前");}public override void OnException(MethodContext context){Logger.Error("方法执行异常", context.Exception);            }public override void OnSuccess(MethodContext context){Logger.Info("方法执行成功后");}public override void OnExit(MethodContext context){Logger.Info("方法退出时,不论方法执行成功还是异常,都会执行");}}// 3.应用Attributepublic class Service{[Logging]public static int Sync(Model model){return model.Id;}[Logging]public async Task<Data> Async(int id){return await Task.Run(() =>{var data = new Data();data.Id = id;return data;});}}public class Model{public int Id { get; set; }public string Name { get; set; }}public class Data{public int Id { get; set; }}

调用代码:

    public static void Main(string[] args){Console.WriteLine("Start...");var config = new NLog.Config.LoggingConfiguration();// Targets where to log to: File and Consolevar logfile = new NLog.Targets.FileTarget("logfile") { FileName = "file.txt" };var logconsole = new NLog.Targets.ConsoleTarget("logconsole");// Rules for mapping loggers to targets            config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole);config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);// Apply config           LogManager.Configuration = config;var service = new Service();var data = service.Async(1);var id = Service.Sync(new Model() { Id = 1, Name = "DemoModel" });Console.WriteLine($"Data Id: {data.Id}, Model Id: {id}");Console.ReadLine();}

调用示例

 

这篇关于C# 静态代码织入AOP组件之肉夹馍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/607118

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解