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

  • 相关阅读:
    Django 【第十二篇】Form组件进阶
    Django 【第十一篇】Form组件基础
    前端知识点总结
    vue组件续和前端工程化
    vue组件
    Vue视图下
    Vue实例与渲染
    BootStrap
    jQuery事件与动画
    dom操作 属性操作 样式操作
  • 原文地址:https://www.cnblogs.com/czcz1024/p/3117440.html
Copyright © 2011-2022 走看看