Class Diagram:

1:IMethodInject:Interface,拥有Executeing,Exceptioned,ExecuteSuccess三个契约为别为执行前,异常,成功。它们都有公同的参数类型:MethodExecutionEventArgs
Executeing:返回值为bool类型,将决定是否继续执行方法体。Exceptioned:属性Eeption代表发生的异常信息,返回值ExceptionStrategy(取值:Handle, ReThrow, ThrowNew)决定异常处理机制,Handle已处理并忽略,ReThrow重新抛出,ThrowNew抛出一个包装后的来源于MethodExecutionEventArgs 的Exception。ExecuteSuccess,对于拥有返回值的方法,可以修改MethodExecutionEventArgs 的ReturnValue,修改返回值。最后MethodExecutionEventArgs的Order决定多个Attribute的注入先后,即方法截获的先后顺序。
1:MethodInterceptBase:针对于方法Attribute标签,实现方法截获
View Code
2:MatchedMethodInterceptBase:和上面方法之上的MethodInterceptBase大体一致,区别在于其应用于class之上,属性Rule为截获方法匹配(应用于多个方法之上相同截获),支持*匹配。
3:PropertyInterceptBase:实现属性的注入,其属性Action(enum PropertyInterceptAction:None Get, Set)指注入属性的get或者Set;
View Code
其上默认都是Executeing继续执行,Exceptioned为抛出不处理,成功不修改result。
下面是一个简单测试Code:
注意测试有两种方式(由于没有安装包):
1:先重编译测试项目,运行ConsoleApplication2(在属性中修改控制台其实参数)。在查看测试项目。
在后续将会从简单Demo分析实现原理。
本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/archive/2011/08/09/2132217.html,如需转载请自行联系原作者