该文章来自网络,如有冒犯,请及时联系!

前提

引用以下文件

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的更多相关文章

  1. 运用Unity实现AOP拦截器

    运用Unity实现AOP拦截器[结合异常记录实例] 本篇文章将通过Unity实现Aop异常记录功能:有关Unity依赖注入可以看前两篇文章: 1:运用Unity实现依赖注入[结合简单三层实例] 2:运 ...

  2. 20181122_C#中AOP_使用Unity实现AOP

    一.   使用Unity的AOP实现 a)         整体项目截图: b) 添加Unity的Nuget包, 直接使用最新版就行, 需要添加两个 Unity 和 Unity.Interceptio ...

  3. 运用Unity实现AOP拦截器[结合异常记录实例]

      本篇文章将通过Unity实现Aop异常记录功能:有关Unity依赖注入可以看前两篇文章: 1:运用Unity实现依赖注入[结合简单三层实例] 2:运用Unity实现依赖注入[有参构造注入] 另早期 ...

  4. Ioc 之 Unity的AOP功能

    前面我们介绍了Unity的依赖注入功能,现在来介绍下Unity的AOP功能.AOP是面向切面编程,它能够使我们在不改变现有代码结构的情况下额外的为其添加一些功能. 我们还是使用配置文件来对类型进行注入 ...

  5. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  6. SuperSocket+unity 网络笔记

    学习SuperSocket 必须要注意的 代码是 static void Main(string[] args) { WebSocketServer appServer = new WebSocket ...

  7. .Net中的AOP读书笔记系列之AOP介绍

    返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是什么? Hello,World! 小结 本系列的源码本人已托管于Coding上:点击查看,想要注册Coding的可以点击该连接注 ...

  8. Unity 3(二):Unity在AOP方面的应用

    本文关注以下方面(环境为VS2012..Net Framework 4.5以及Unity 3): AOP简介: Interception using Unity示例 配置文件示例 一.AOP简介 AO ...

  9. .NET中使用unity实现aop

    Unity是一款知名的依赖注入容器,其支持通过自定义扩展来扩充功能.在Unity软件包内默认包含了一个对象拦截(Interception)扩展定义.本篇文章将介绍如何使用对象拦截功能来帮助你分离横切关 ...

随机推荐

  1. tensorflow中有向图(计算图、Graph)、上下文环境(Session)和执行流程

    计算图(Graph) Tensorflow是基于图(Graph)的计算框架,图的节点由事先定义的运算(操作.Operation)构成,图的各个节点之间由张量(tensor)来链接,Tensorflow ...

  2. RedHat 6.8 打开vga之后Login界面花屏

    /******************************************************************* * RedHat 6.8 打开vga之后Login界面花屏 * ...

  3. Redis的一些常用命令操作

    五种 基本数据 类型 以及操作命令操作命令的网址:http://doc.redisfans.com/ 一.在可视化界面上打开命令窗口 二.打开后就是这样子 三.命令操作---查询.删除.字符串 1.k ...

  4. Linux 下如何调试 Python?

    一般开发者都是在 IDE 中进行程序的调试,当然,有 IDE 的话,当然首选 IDE 进行调试. 但是,有时我们的业务场景,限制只能在 Linux 命令行模式进行调试. 这时该怎么办呢? 今天,就给大 ...

  5. Python 2.7_爬取CSDN单页面博客文章及url(二)_xpath提取_20170118

    上次用的是正则匹配文章title 和文章url,因为最近在看Scrapy框架爬虫 需要了解xpath语法 学习了下拿这个例子练手 1.爬取的单页面还是这个rooturl:http://blog.csd ...

  6. 图m的着色问题(搜索)

    图的m着色问题 [问题描述]        给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的 ...

  7. [转]NME Android目标中文输入问题完美解决!

    最近研究了一下haxe,发现蛮牛逼的,转几篇知识帖 haXe开发笔记:中文问题的小结 * .hx源文件中如果包含中文,要保存成UTF-8编码才能够正确被haXe编译器解析,是否包含BOM(Byte O ...

  8. git ssh登录

    .ssh下创建config文件 其内容: Host ipIdentityFile ~/.ssh/私钥文件名Port 22User git服务器的账号,不是git账号名(私钥文件名才是git账号名) 注 ...

  9. 基于TCP协议 I/O多路转接(select) 的高性能回显服务器客户端模型

    服务端代码: myselect.c #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> ...

  10. Angular5学习笔记 - 服务优化(十)

    一.服务合并 二.验证效果