网络笔记-unity 实现AOP
该文章来自网络,如有冒犯,请及时联系!
前提
引用以下文件
Microsoft.Practices.ObjectBuilder2.dll
Microsoft.Practices.Unity.dll
Microsoft.Practices.Unity.Configuration.dll
Microsoft.Practices.Unity.Interception.dll
Microsoft.Practices.Unity.Interception.Configuration.dll
Microsoft.Practices.Unity.StaticFactory.dll
可以从网站http://unity.codeplex.com/下载
本文中的实现类继承于IOutput接口
1: public interface IOutput {
2: void Output(int x);
3: }
实现效果
我有两个方法可以输出字符串, 调用IOutput的实现类来输出的,如:
1: class OutputImplement2 : IOutput {
2: public void Output(int x) {
3: Console.WriteLine("output:{0}", x);
4: }
5: }
调用它即在Main函数中
1: var op2=new OutputImplement2();
2: op2.Output(22);
即可,而AOP的作用是通过其它代码,向op2.Output方法执行前或执行后注入其它执行过程即最后形成的结果可能是:

这里除了箭头所指的一句外其它的都是注入进去这个方法的。
定义处理代码
这里我们先定义一段处理方法的代码,Unity规定它是ICallHandler的一个实现
1: public class MyHandler : ICallHandler {
2: public int Order { get; set; }//这是ICallHandler的成员,表示执行顺序
3: public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) {
4: Console.WriteLine("方法名: {0}", input.MethodBase.Name);
5: Console.WriteLine("参数:");
6: for (var i = 0; i < input.Arguments.Count; i++) {
7: Console.WriteLine("{0}: {1}", input.Arguments.ParameterName(i), input.Arguments[i]);
8: }
9: Console.WriteLine("执行");
10: //这之前插入方法执行前的处理
11: var retvalue = getNext()(input, getNext);//在这里执行方法
12: //这之后插入方法执行后的处理
13: Console.WriteLine("完成");
14: return retvalue;
15: }
16: }
好,下面我们来看看怎么把MyHandler与IOutput关联起来,大体有2种方法
1.通过代码直接关联
这种实现方式比较“硬”。
它是利用Atrribute来实现这种关联的,首先,先建一个Attribute。
1: public class MyHandlerAttribute : HandlerAttribute {
2: public override ICallHandler CreateHandler(IUnityContainer container) {
3: return new MyHandler();//返回MyHandler
4: }
5: }
然后在IOutput的实现中使用如下代码:
1: [MyHandler]
2: class OutputImplement1 : IOutput {
3: public void Output(int x) {
4: Console.WriteLine("重典执行此方法输出:{0}", x);
5: }
6: }
这里靠此Attribute就将二者关联了起来
现在执行处写:
1: var container1 = new UnityContainer()
2: .AddNewExtension<Interception>()
3: .RegisterType<IOutput, OutputImplement1>();//声明UnityContainer并注册IOutput
4: container1
5: .Configure<Interception>()
6: .SetInterceptorFor<IOutput>(new InterfaceInterceptor());
7: var op1 = container1.Resolve<IOutput>();
8: op1.Output(11);//调用
That’s all OK.
2.用配置文件处理
如果用配置文件的话就不用Attribute了,所以实现的类如下
1: class OutputImplement2 : IOutput {
2: public void Output(int x) {
3: Console.WriteLine("重典执行此方法输出:{0}", x);
4: }
5: }
这里不使用属性来标记了,而使用配置文件,我们建一个名为Unity.xml的配置文件(配置文件长,可以后看):
1: <?xml version="1.0" encoding="utf-8" ?>
2: <configuration>
3: <configSections>
4: <section name="unity"
5: type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
6: Microsoft.Practices.Unity.Configuration, Version=1.2.0.0,
7: Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
8: </configSections>
9: <unity>
10: <typeAliases>
11: <typeAlias alias="singleton"
12: type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
13: <typeAlias alias="transparentProxy"
14: type="Microsoft.Practices.Unity.InterceptionExtension.TransparentProxyInterceptor, Microsoft.Practices.Unity.Interception" />
15: <typeAlias alias="typeMatchingRule"
16: type="Microsoft.Practices.Unity.InterceptionExtension.TypeMatchingRule, Microsoft.Practices.Unity.Interception"/>
17: <typeAlias alias="interception"
18: type="Microsoft.Practices.Unity.InterceptionExtension.Interception, Microsoft.Practices.Unity.Interception"/>
19: <typeAlias alias="IOutput" type="ConsoleApplication1.IOutput, ConsoleApplication1" />
20: <typeAlias alias="MyHandler" type="ConsoleApplication1.MyHandler, ConsoleApplication1" />
21: <typeAlias alias="OutputImplement2" type="ConsoleApplication1.OutputImplement2, ConsoleApplication1" />
22: </typeAliases>
23: <containers>
24: <container name="DefContainer">
25: <types>
26: <type type="IOutput" mapTo="OutputImplement2" name="">
27: <lifetime type="singleton" />
28: </type>
29: </types>
30: </container>
31: </containers>
32: </unity>
33: </configuration>
最后我们来执行,要比第一种方法复杂一点:
1: var container2 = new UnityContainer().AddNewExtension<Interception>();//声明UnityContainer
2: var map = new ExeConfigurationFileMap {ExeConfigFilename = "Unity.xml"};//使用此配置文件
3: var config
4: = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
5: var section
6: = (UnityConfigurationSection)config.GetSection("unity");//读取配置文件节点
7: section.Containers["DefContainer"].Configure(container2);
8: container2.Configure<Interception>()
9: .SetDefaultInterceptorFor<IOutput>(new TransparentProxyInterceptor())
10: .AddPolicy("LogMethod")
11: .AddMatchingRule(new TypeMatchingRule("IOutput"))
12: .AddCallHandler(typeof(MyHandler));
13: var op2 = container2.Resolve<IOutput>();
14: op2.Output(22);//调用
OK这时我们看到的结果就是:

网络笔记-unity 实现AOP的更多相关文章
- 运用Unity实现AOP拦截器
运用Unity实现AOP拦截器[结合异常记录实例] 本篇文章将通过Unity实现Aop异常记录功能:有关Unity依赖注入可以看前两篇文章: 1:运用Unity实现依赖注入[结合简单三层实例] 2:运 ...
- 20181122_C#中AOP_使用Unity实现AOP
一. 使用Unity的AOP实现 a) 整体项目截图: b) 添加Unity的Nuget包, 直接使用最新版就行, 需要添加两个 Unity 和 Unity.Interceptio ...
- 运用Unity实现AOP拦截器[结合异常记录实例]
本篇文章将通过Unity实现Aop异常记录功能:有关Unity依赖注入可以看前两篇文章: 1:运用Unity实现依赖注入[结合简单三层实例] 2:运用Unity实现依赖注入[有参构造注入] 另早期 ...
- Ioc 之 Unity的AOP功能
前面我们介绍了Unity的依赖注入功能,现在来介绍下Unity的AOP功能.AOP是面向切面编程,它能够使我们在不改变现有代码结构的情况下额外的为其添加一些功能. 我们还是使用配置文件来对类型进行注入 ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- SuperSocket+unity 网络笔记
学习SuperSocket 必须要注意的 代码是 static void Main(string[] args) { WebSocketServer appServer = new WebSocket ...
- .Net中的AOP读书笔记系列之AOP介绍
返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是什么? Hello,World! 小结 本系列的源码本人已托管于Coding上:点击查看,想要注册Coding的可以点击该连接注 ...
- Unity 3(二):Unity在AOP方面的应用
本文关注以下方面(环境为VS2012..Net Framework 4.5以及Unity 3): AOP简介: Interception using Unity示例 配置文件示例 一.AOP简介 AO ...
- .NET中使用unity实现aop
Unity是一款知名的依赖注入容器,其支持通过自定义扩展来扩充功能.在Unity软件包内默认包含了一个对象拦截(Interception)扩展定义.本篇文章将介绍如何使用对象拦截功能来帮助你分离横切关 ...
随机推荐
- L122
These plants have much of the same nutritional value that a real plant has. Search giant Google says ...
- Leetcode 904. Fruit Into Baskets
sliding window(滑动窗口)算法 class Solution(object): def totalFruit(self, tree): """ :type ...
- VueJs路由跳转——vue-router的使用
对于单页应用,官方提供了vue-router进行路由跳转的处理,本篇主要也是基于其官方文档写作而成. 安装 基于传统,我更喜欢采用npm包的形式进行安装. npm install vue-router ...
- C#进阶之路(一):委托
一.什么是委托 简单说它就是一个能把方法当参数传递的对象,而且还知道怎么调用这个方法,同时也是粒度更小的“接口”(约束了指向方法的签名). 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方 ...
- centos下wget: command not found的解决方法
今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包.一般linux最小化安装时,wget不会默认被安装,这里是C ...
- Operating System-进程间互斥的方案-保证同一时间只有一个进程进入临界区(3)- TSL指令
本文接上一篇文章继续介绍如何实现同一时间只允许一个进程进入临界区的机制.本文主要介绍TSL指令. 方案汇总 屏蔽中断 锁变量 严格轮换法 TSL指令 Peterson解法 一.What is TSL ...
- HDOJ1010 (DFS+奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- SOAP webserivce 和 RESTful webservice 对比及区别
简单对象访问协议(Simple Object Access Protocol,SOAP)是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传 ...
- postgresql 数据库,模式,表空间的关系
数据库与模式模式(schema)是对数据库(database)逻辑分割在数据库创建的同时,就已经默认为数据库创建了一个模式--public,这也是该数据库的默认模式.所有为此数据库创建的对象(表.函数 ...
- 解决django不能以本机ip地址访问
在使用django框架来架设网站时,我们测试一般是通过django的开发服务器来完成,但是我们可以看到生成的地址是127.0.0.1:8000这样的话,我们在外网就无法访问了. 解决办法是通过传入第三 ...