天天看点

.NET Core 实现动态代理做AOP(面向切面编程)

.NET Core 实现动态代理做AOP(面向切面编程)

用动态代理可以做AOP(面向切面编程),进行无入侵式实现自己的扩展业务,调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,比如:日志记录、性能统计、安全控制、事务处理、异常处理等等。本方式实现思路用的.NET Core原生的DispatchProxy类,再加《特性标记》+《Handle接口》达到无入侵式扩展

  用动态代理可以做AOP(面向切面编程),进行无入侵式实现自己的扩展业务,调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,比如:日志记录、性能统计、安全控制、事务处理、异常处理等等。本方式实现思路用的.NET Core原生的DispatchProxy类,再加《特性标记》+《Handle接口》达到无入侵式扩展 ,有兴趣的朋友,自行改进一下,封装成组件。

  有什么做的不好的或者建议,希望大家及时提出,帮助改进。

  代码上传在gitee:https://gitee.com/luoxiangbao/dynamic-proxy.git

  DispatchProxy我去看了一下源码,和我设想的差不多,就是Emit类库直接编写IL语言,动态生成类和方法,然后在方法里调用Invoke方法,这个时候就我们只需要重写Invoke方法,具体实现由我们自己管控。其性能很高,几乎和我们写好的C#编译成IL没多大区别,大家用的Autofac的AOP,我也看了一下,底层用的是Castle.Core类库,而Castle.Core底层还是用的Emit方式实现,只是思路不同。

便于理解我给大家贴一下源码:

1.定义抽象DispatchProxy类的Invoke元数据

.NET Core 实现动态代理做AOP(面向切面编程)

 2.Emit类库直接编写IL语言,为代理类添加调用Invoke方法代码

.NET Core 实现动态代理做AOP(面向切面编程)

  IL是.NET框架中间语言(Intermediate Language),编译器可以直接将源程序编译为.exe或.dll文件,而CLR(公共语言运行时)执行的是IL语言,不是C#高级编程语言,IL代码是一种近似于指令式的代码语言,与汇编语言比较相近,给大家做个案例对比一下。

C#代码:

IL代码:

  有兴趣的朋友自己也可以去实现。接下来进入正题,我们怎么利用DispatchProxy自己造轮子!!!

   核心类就是,DispatchProxy。这是.NET core 原生的。会帮我们创建一个代理类

  这个接口定义:执行之前、执行之后两个方法。用来实现具体业务逻辑的处理

  1.用来标记类具体使用哪个handle的实现来处理业务。

  2. 特性定义Type属性决定创建代理类的时候,具体使用哪个handle实现

  这里就是来组装代理类与handle实现的地方。

  1.拿到具体类,获取Type,获取我们上面定义的特性,通过特性的属性,用来创建handle实例

  2.ServiceHelp是我定义的一个来获取实例化的容器帮助类。这个用.NET CORE 原始的IOC。大家可替换成autofac

  3.创建化代理实例,把实例和handle实现的具体方法:AfterAction、BeforeAction传入。用于代理类执行的时候,进行真正的调用

  这里大家可自行发挥

  定义实现,并且在类上加上,AOP交给哪个handle

  1.创建容器,把我们自己的业务实现都注册好

  2.通过工厂进行,动态创建代理实例

.NET Core 实现动态代理做AOP(面向切面编程)

  大家可直接访问我的,gitee

  https://gitee.com/luoxiangbao/dynamic-proxy.git