zoukankan      html  css  js  c++  java
  • 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的问题,但是总感觉这个不太放心。

  • 相关阅读:
    linux查看用户组所有成员
    navicat for mysql 在Mac上安装后没有连接列表,就是左边的那一列连接项目怎么办?
    mysql启动问题access denied for user 'root'@'localhost'(using password:YES)
    phpcms多站点表单统一到主站点管理的解决方案
    thinkphp5.0 session驱动方式问题汇总
    Python__开启进程的两种方式
    Python并发编程之操作系统理论部分
    操作系统简介
    Python__基于udp的套接字
    网络编程1
  • 原文地址:https://www.cnblogs.com/czcz1024/p/3117440.html
Copyright © 2011-2022 走看看