之前学习.NET CORE 接触到切面编程这个概念,比较感兴趣,怎奈工作太忙,没时间研究,这周难得空闲一天,就试了下,在这里分享下。
1、什么是AOP?
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程。举个例子,.NET MVC中的filter就是切面编程的一种实现,过滤器就是一个切面,哪里需要就插到哪里,如果不需要就拔掉即可,从而实现可插拔操作。
2、Aspect-Injector
Aspect Injector 是一个开源的AOP框架,支持.NET OCRE,这个框架比较轻量级,但是麻雀虽小五脏俱全,它可以满足于大部分AOP场景:
- 支持.NET Core
- 支持对异步方法注入切面
- 能够把切面注入到方法、属性和事件上
- 支持Attribute的方式注入切面
3、实现
首先要引入 Aspect Injector,我用的是VS2019,在NuGet里面,搜索并安装就可以了。
接下来就是引入命名空间,并进行编码了,在这我写了两个很简单的示例,大家看下。这里说明下,我看了很多教程,里面的写法不尽相同,应该是.NET CORE版本不同对应的Aspect Injector不同,导致写法不同,我这边项目的版本是.NET CORE 3.1 ,然后Aspect Injector版本是2.4.1
1 using AspectInjector.Broker; 2 using Newtonsoft.Json; 3 using System; 4 using System.Collections.Generic; 5 using System.Diagnostics; 6 using System.Text; 7 8 namespace Y.AOP.Service 9 { 10 /// </summary> 11 /// description:基于Aspect-Injector实现AOP,执行前执行后示例 12 /// version:1.0 13 /// author:PrintY 14 /// date:2020-08-09 15 /// </summary> 16 [Aspect(Scope.Global)] 17 [Injection(typeof(LogAspect))] 18 public class LogAspect : Attribute 19 { 20 /// <summary> 21 /// 执行前 22 /// </summary> 23 /// <param name="name">方法名</param> 24 /// <param name="arguments">参数</param> 25 [Advice(Kind.Before)] 26 public void LogBefore([Argument(Source.Name)] string name, [Argument(Source.Arguments)] object[] arguments) 27 { 28 Console.WriteLine(""); 29 Console.WriteLine($"Before,调用方法:'{name}',调用参数:{JsonConvert.SerializeObject(arguments)}"); 30 } 31 32 /// <summary> 33 /// 执行后 34 /// </summary> 35 /// <param name="name">方法名</param> 36 /// <param name="arguments">参数</param> 37 /// <param name="retrrnValue">返回值</param> 38 [Advice(Kind.After)] 39 public void LogAfter([Argument(Source.Name)] string name, [Argument(Source.Arguments)] object[] arguments, [Argument(Source.ReturnValue)] object retrrnValue) 40 { 41 Console.WriteLine(""); 42 Console.WriteLine($"After,调用方法:'{name}',调用参数:{JsonConvert.SerializeObject(arguments)},返回值为:{JsonConvert.SerializeObject(retrrnValue)}"); 43 } 44 } 45 }
使用的话就很简单了,只要是用过 ASP.NET MVC的应该都见过这个用法:
1 [LogAspect] 2 public string GetLog(string Msg = "AOP LOG 测试!") 3 { 4 return "这是" + Msg; 5 }
上面的示例很简单,算是初识Aspect Injector,以后有更深入的了解再做分享。