AOP从静态代理到动态代理(Emit实现)详解

2020-01-05 09:19:14王冬梅

里面实现了两种代理方式,一种是 面向接口实现 的方式,另一种是 继承重写 的方式。

但是继承重写的方式需要把业务类的所有方法写成virtual虚方法,动态类会重写该方法。

我们从上一节的Demo中获取到运行时生成的代理类dll,用ILSpy反编译查看源代码:

AOP,静态代理,动态代理,Emit

可以看到,我们的代理类分别调用了我们特性标签中的各项方法。

核心代码分析(源代码在上面折叠部位已经贴出):

AOP,静态代理,动态代理,Emit

解释:如果该方法存在Action标签,那么加载 action 标签实例化对象,加载参数,执行Before方法;如果该方法存在Interceptor标签,那么使用类字段this._interceptor调用该标签的Invoke方法。

AOP,静态代理,动态代理,Emit

解释:如果面的Interceptor特性标签不存在,那么会加载当前扫描的方法对应的参数,直接调用方法;如果Action标签存在,则将刚才调用的结果包装成object对象传递到After方法中。