Skip to content

Repository files navigation

AopSolutions

几个面向切面的解决方案,都是根据自己的理解实现的

其中包含4个实现

1.AopWrapper

运行时注入。
是通过emit生成目标类型的派生类型,
在重写的方法中将以特性方式标记的拦截器生成代码,
这种实现的要求就是目标类型必须可被继承,标记了拦截器的方法必须要可以被重写。
该类库兼容Task异步模型。
该类库目前已经在作者所在公司里广泛使用。

2.AspectX

这是一个轻量级的实现,是通过对委托的动态织入来实现,
和其他实现方式最大的区别在于没有使用特性,所以也就不存在黑盒子,
其中定义了有无返回值,是否异步,计四种Worker,
通过对Worker添加静态扩展方法就可以定义拦截器,
使用的时候通过Worker对象要将核心方法包装起来,并调用对应的拦截器即可。

3.AopProxy

这个实现最简单,直接继承微软提供的透明代理类RealProxy即可,
然后调用GetTransparentProxy方法就可以获取一个透明代理对象,
但是他返回的对象类型是运行时类型。

4.AopDecorator

运行时注入。
这是一个通过Emit生成装饰者代码,将目标对象包装起来,
然后通过Interceptor来转发对目标对象方法的调用,
代码我写完了,但是在复杂的情况下(包含可选参数等情况)执行有异常,一直没找到原因。

其他实现思路

动态类型DynamicMetaObject

通过动态对象包装目标对象来实现方法的拦截,顾名思义,这个返回的结果必须是dynamic,和依赖注入很难配合使用,开源的有个KingAOP:https://github.com/AntyaDev/KingAOP。

编译时注入

个人认为这种方式是最理想的实现,效率也高,市面上有PostSharp就是这种实现,
编译时注入就是在编译DLL之后直接就把DLL给改了,把拦截器方法注入进去,实现有点难,
相对于运行时注入要求目标类型方法可被重写,编译时注入对目标类型没有任何要求。
使用Mono可以修改DLL。	

About

几个面向切面的解决方案,都是根据自己的理解实现的

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages