几个面向切面的解决方案,都是根据自己的理解实现的
运行时注入。
是通过emit生成目标类型的派生类型,
在重写的方法中将以特性方式标记的拦截器生成代码,
这种实现的要求就是目标类型必须可被继承,标记了拦截器的方法必须要可以被重写。
该类库兼容Task异步模型。
该类库目前已经在作者所在公司里广泛使用。
这是一个轻量级的实现,是通过对委托的动态织入来实现,
和其他实现方式最大的区别在于没有使用特性,所以也就不存在黑盒子,
其中定义了有无返回值,是否异步,计四种Worker,
通过对Worker添加静态扩展方法就可以定义拦截器,
使用的时候通过Worker对象要将核心方法包装起来,并调用对应的拦截器即可。
这个实现最简单,直接继承微软提供的透明代理类RealProxy即可,
然后调用GetTransparentProxy方法就可以获取一个透明代理对象,
但是他返回的对象类型是运行时类型。
运行时注入。
这是一个通过Emit生成装饰者代码,将目标对象包装起来,
然后通过Interceptor来转发对目标对象方法的调用,
代码我写完了,但是在复杂的情况下(包含可选参数等情况)执行有异常,一直没找到原因。
通过动态对象包装目标对象来实现方法的拦截,顾名思义,这个返回的结果必须是dynamic,和依赖注入很难配合使用,开源的有个KingAOP:https://github.com/AntyaDev/KingAOP。
个人认为这种方式是最理想的实现,效率也高,市面上有PostSharp就是这种实现,
编译时注入就是在编译DLL之后直接就把DLL给改了,把拦截器方法注入进去,实现有点难,
相对于运行时注入要求目标类型方法可被重写,编译时注入对目标类型没有任何要求。
使用Mono可以修改DLL。