C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#静态代码织入AOP组件

C#静态代码织入AOP组件之Rougamo的使用详解

作者:rjcql

Rougamo是一个静态代码织入的AOP组件,同为AOP组件较为常用的有Castle、Autofac、AspectCore等,下面就跟随小编一起来学习一下它的具体使用吧

写在前面

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

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.应用Attribute
    public 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 Console
        var 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组件之Rougamo的使用详解的文章就介绍到这了,更多相关C#静态代码织入AOP组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文