AOP从静态代理到动态代理 Emit实现 (2)

  定义一个Action特性类 ActionAttribute 继承自 ActionBaseAttribute,里面在Before和After方法中输出两条日志;

  

AOP从静态代理到动态代理 Emit实现

  定义一个Action特性类 InterceptorAttribute 继承自 InterceptorBaseAttribute,里面捕获了方法调用异常,以及执行前后分别输出日志;

  

AOP从静态代理到动态代理 Emit实现

  然后定义一个业务类 BusinessClass 实现了 IBusinessClass 接口,定义了各种类型的方法

  

AOP从静态代理到动态代理 Emit实现

  

AOP从静态代理到动态代理 Emit实现

  多余的方法不贴图了。

  我们把上面定义的方法调用切面标签放在业务类上,表示该类下所有的方法都执行异常过滤;

  我们把Action特性放在Test方法上,表明要在 Test() 方法的 Before 和 After 调用时记录日志;

  我们定义测试类:

  

AOP从静态代理到动态代理 Emit实现

  调用一下试试:

  

AOP从静态代理到动态代理 Emit实现

  可见,全类方法标签 Interceptor Test GetInt 方法调用前后都打出了对应的日志;

  Action方法标签只在 Test 方法上做了标记,那么Test 方法 Before After 执行时打出了日志;

【实现过程】

  实现的思路在上面已经有详细的讲解,可以参考静态代理的实现思路。

  我们定义一个动态代理生成类 DynamicProxy,用于原业务代码的扫描和代理类代码的生成;

  定义两个过滤器标签,ActionBaseAttribute,提供 Before 和 After 切面方法;InterceptorBaseAttribute,提供 Invoke “全调用”包装的切面方法;

  Before可以获取到当前调用的方法和参数列表,After可以获取到当前方法调用以后的结果。

  Invoke 可以拿到当前调用的对象和方法名,参数列表。在这里进行反射动态调用。

1 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 2 public class ActionBaseAttribute : Attribute 3 { 4 public virtual void Before(string @method, object[] parameters) { } 5 6 public virtual object After(string @method, object result) { return result; } 7 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfjgw.html