snap 地址 https://github.com/TylerBrinks/Snap
snap是基于dynamicproxy的一个aop,选择尝试一下这个的最主要原因是他支持autofac
nuget引入包,包引入后,会有一个AutofacAopSample.cs文件,提供了一个示例,还是比较好懂的。
写一个类继承MethodInterceptor,作为切面程序。可以override3个方法
void BeforeInvocation()
void InterceptMethod(IInvocation invocation, MethodBase method, Attribute attribute)在此方法中调用invocation.Proceed();执行真实的方法
void AfterInvocation()
写一个attribute继承MethodInterceptAttribute,此attribute将被标记到具体的方法上
在autofac上配置,参照示例,很容易就实现了。
当一个方法上标记了多个切面后,执行顺序看上去并不符合预想中的。
before aop a
aop a
after aop a
before aop b
aop b
real method
after aop b
加上第三个
before aop a
aop a
after aop a
before aop b
aop b
after aop b
before aop c
aop c
real method
after aop c
只会在最后一个切面的invocation.Proceed();才会真正的执行方法,这个到是和预期一致。但是也只有最后的一个after才是真正的after,这个就和预期有点差别了。
另外,几个切面的执行顺序(不定义order的情况下)和attribute的添加顺序无关,而和几个切面在配置时的先后顺序有关。
多个切面时,如果修改方法传入的参数,第一个修改了,传到第二个里,第二个获取到的方法参数是第一个修改过的。一直往下传,直到传到真实的方法里,全部都是修改过的,每个切面都可以进行修改。
对于返回值,因为只有最后一个切面才真正的执行真是方法;所以前面的切面返回值是null,如果前面的切面修改了返回值,则后面的切面获取到的是前面切面修改过的值。
不知道这个是snap的问题还是dynamicproxy的问题,但是总感觉这个不太放心。