一.   使用Unity的AOP实现

a)         整体项目截图:

20181122_C#中AOP_使用Unity实现AOP

b) 添加Unity的Nuget包, 直接使用最新版就行, 需要添加两个 Unity 和 Unity.Interception (这个是为AOP做的一个扩展) 

 20181122_C#中AOP_使用Unity实现AOP

c)    AOP配置文件, 详细注释(CfgFiles\Unity.Config)

 1 <!--这是一个标准Unity配置文件的格式-->
 2 
 3 <configuration> <!--根节点名称-->
 4   <configSections>
 5     <!--name容器的名称    type 表示如何查找节点, 这是固定写法-->
 6     <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
 7   </configSections>
 8   <unity>
 9     <!--下面一行是固定写法, 用这个写法来支持AOP-->
10     <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
11     <containers><!--定义一组容器-->
12       <container name="aopContainer">
13       <!--定义一个容器; 表示在IUserProcessor这个接口下所有的方法都给他增加, 这个容器(aopContainer)内所包含的方法-->
14         <extension type="Interception"/>
15         <!--这里使用Interception类型的扩展; 其实在Unity中有三种类型来处理这件事; 这种是属于实现接口的方法, 还有一种是继承父类; 第三种是使用Virtual虚方法的形式, 使用虚方法有点类似于CastleProxyAOP这个代理-->
16         <!--把接口映射到具体的实现类; 也就是说告诉容器如果遇到了MyAOP.UnityWay.IUserProcessor这个抽象, 就使用MyAOP.UnityWay.UserProcessor来帮我们实例化-->
17         <!--MyAOP.UnityWay.IUserProcessor完整的接口名称, MyAOP是程序所在的dll名称, 程序集的名称(当然在这里是当前exe文件的名称-->
18         <!--MyAOP.UnityWay.UserProcessor具体的实现类, MyAOP和上面的解释一样-->
19         <!--MyAOP是程序集的名称-->
20         <!-- register type="MyAOP.UnityWay.IUserProcessor,MyAOP" mapTo="MyAOP.UnityWay.UserProcessor,MyAOP"  这一句整体的意思就是告诉容器, 如果遇到IUserProcessor这个抽象, 就使用UserProcessor类来帮我进行初始化一个具体的实例出来-->
21         <register type="MyAOP.UnityWay.IUserProcessor,MyAOP" mapTo="MyAOP.UnityWay.UserProcessor,MyAOP">
22           <!--Unity中的AOP有三种模式, 第一种必须继承MarshalByRefObject这个父类的AOP
23           第二种必须是虚方法的AOP
24           第三种就是下面写的接口形式的 InterfaceInterceptor 一般都用这种接口形式的:
25             表示只要是接口下的所有方法, 都会被增加上下面的方法
26           -->
27           <interceptor type="InterfaceInterceptor"/> <!--AOP支持的模式; 推荐使用这种接口模式的-->
28           <!--下面这五个表示  在IUserProcessor接口中的所有方法, 都拥有下面方法的扩展-->
29           
30           <!--异常处理的; 注意如果你想全局处理异常, 则应该把异常处理的Behavior放到最顶层, 否则在Unity中自己抛出的异常则会抓不到-->
31           <interceptionBehavior type="MyAOP.UnityWay.ExceptionLoggingBehavior, MyAOP"/>
32           <!--缓存的behavior; 注意缓存的Behavior也应该放在记录日志之前; 需要注意的是, 如果被缓存命中了, 那么后面的AOP也不会执行的-->
33           <interceptionBehavior type="MyAOP.UnityWay.CachingBehavior, MyAOP"/>
34           <!--方法执行前写日志-->
35           <interceptionBehavior type="MyAOP.UnityWay.LogBeforeBehavior, MyAOP"/>
36           <!--参数检查-->
37           <interceptionBehavior type="MyAOP.UnityWay.ParameterCheckBehavior, MyAOP"/>
38           <!--方法执行后做的事情-->
39           <interceptionBehavior type="MyAOP.UnityWay.LogAfterBehavior, MyAOP"/>
40         </register>
41       </container>
42     </containers>
43   </unity>
44 </configuration>
View Code

相关文章: