一. 使用Unity的AOP实现
a) 整体项目截图:
b) 添加Unity的Nuget包, 直接使用最新版就行, 需要添加两个 Unity 和 Unity.Interception (这个是为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>