snap aop 尝试

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的问题,但是总感觉这个不太放心。

原文地址:https://www.cnblogs.com/czcz1024/p/3117440.html