前提

引用以下文件

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接口

interface IOutput {
int x);
   3: }

实现效果

我有两个方法可以输出字符串, 调用IOutput的实现类来输出的,如:

class OutputImplement2 : IOutput {
int x) {
, x);
   4:     }
   5: }

调用它即在Main函数中

new OutputImplement2();
   2: op2.Output(22);

即可,而AOP的作用是通过其它代码,向op2.Output方法执行前或执行后注入其它执行过程即最后形成的结果可能是:

使用Unity 实现 AOP

这里除了箭头所指的一句外其它的都是注入进去这个方法的。

 

定义处理代码

这里我们先定义一段处理方法的代码,Unity规定它是ICallHandler的一个实现

class MyHandler : ICallHandler {
//这是ICallHandler的成员,表示执行顺序
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) {
, input.MethodBase.Name);
);
for (var i = 0; i < input.Arguments.Count; i++) {
, input.Arguments.ParameterName(i), input.Arguments[i]);
   8:         }
);
//这之前插入方法执行前的处理
//在这里执行方法
//这之后插入方法执行后的处理
);
return retvalue;
  15:     }
  16: }

好,下面我们来看看怎么把MyHandler与IOutput关联起来,大体有2种方法

1.通过代码直接关联

这种实现方式比较“硬”。

它是利用Atrribute来实现这种关联的,首先,先建一个Attribute。

class MyHandlerAttribute : HandlerAttribute {
override ICallHandler CreateHandler(IUnityContainer container) {
//返回MyHandler
   4:     }
   5: }

然后在IOutput的实现中使用如下代码:

   1: [MyHandler]
class OutputImplement1 : IOutput {
int x) {
, x);
   5:      }
   6:  }

这里靠此Attribute就将二者关联了起来

现在执行处写:

new UnityContainer()
   2:     .AddNewExtension<Interception>()
//声明UnityContainer并注册IOutput
   4: container1
   5:     .Configure<Interception>()
new InterfaceInterceptor());
   7: var op1 = container1.Resolve<IOutput>();
   8: op1.Output(11);//调用

That’s all OK.

2.用配置文件处理

如果用配置文件的话就不用Attribute了,所以实现的类如下

class OutputImplement2 : IOutput {
int x) {
, x);
   4:     }
   5: }

这里不使用属性来标记了,而使用配置文件,我们建一个名为Unity.xml的配置文件(配置文件长,可以后看):

>
>
>
   6:                  Microsoft.Practices.Unity.Configuration, Version=1.2.0.0,
/>
>
>
>
/>
/>
/>
/>
/>
/>
/>
>
>
>
>
>
/>
>
>
>
>
>
>

最后我们来执行,要比第一种方法复杂一点:

//声明UnityContainer
//使用此配置文件
   3: var config
   4:    = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
   5: var section
//读取配置文件节点
].Configure(container2);
   8: container2.Configure<Interception>()
new TransparentProxyInterceptor())
)
))
typeof(MyHandler));
  13: var op2 = container2.Resolve<IOutput>();
  14: op2.Output(22);//调用

 

OK这时我们看到的结果就是:

使用Unity 实现 AOP

代码下载:

相关文章: