定义一个Action特性类 ActionAttribute 继承自 ActionBaseAttribute,里面在Before和After方法中输出两条日志;
定义一个Action特性类 InterceptorAttribute 继承自 InterceptorBaseAttribute,里面捕获了方法调用异常,以及执行前后分别输出日志;
然后定义一个业务类 BusinessClass 实现了 IBusinessClass 接口,定义了各种类型的方法
多余的方法不贴图了。
我们把上面定义的方法调用切面标签放在业务类上,表示该类下所有的方法都执行异常过滤;
我们把Action特性放在Test方法上,表明要在 Test() 方法的 Before 和 After 调用时记录日志;
我们定义测试类:
调用一下试试:
可见,全类方法标签 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 }