码迷,mamicode.com
首页 > 其他好文 > 详细

Autofac 之 基于 Castle DynamicProxy2 的 Interceptor 功能

时间:2016-07-23 22:56:17      阅读:419      评论:0      收藏:0      [点我收藏+]

标签:

Autofac 结合 Castle DynamicProxy2 功能
 
     Autofac 不仅作为轻量级高效的 IoC 容器,而且还能很好的与 Castle.DynamicProxy2 结合起来,实现 AOP 功能。
     首先,我们需要定义拦截器,简单的定义可实现 Castle.DynamicProxy.IInterceptor 接口即可。
 
添加拦截器
 
     定义好了拦截器后,如何应用到相关对象呢?有两种方式:
     1)使用 Autofac.Extras.DynamicProxy2.InterceptAttribute 特性将拦截器添加到相关的类或接口上;
     2)使用 ContainerBuilder 的 InterceptedBy() 方法在注册对象的同时添加拦截器。
 
     如何启用拦截器呢?我们只需要在 IoC 注册启用即可。启用拦截器有三种方式,其中针对 WCF 比较特别,下面来具体分析这几种方式的应用场景:
 
基于接口的拦截器
 
     在注册对象的同时启用 EnableInterfaceInterceptors() 方法。
     使用接口的拦截器,在使用特性 [Attribute] 注册时,注册拦截器可注册到接口(Interface)上或其实现类(Implement)上。使用注册到接口上方式,所有的实现类都能应用到拦截器。
     对于以接口方式的注入,Autofac Interceptor 要求类的方法为 public 或 virtual 即可。
     
示例代码:
var builder = new ContainerBuilder();
builder.RegisterType<SomeType>()
       .As<ISomeInterface>()
       .EnableInterfaceInterceptors();
builder.Register(c => new CallLogger(Console.Out));
var container = builder.Build();
var willBeIntercepted = container.Resolve<ISomeInterface>();

 

 
基于类的拦截器
 
     在注册对象的同时启用 EnableClassInterceptors() 方法。
     对于以类方式的注入,Autofac Interceptor 要求类的方法为必须为 virtual 方法。
     值得注意的是:对于 子类,重写(override)父类的虚方法时,能应用到拦截器。父类可在 IoC 中注册也可不需要注册,但子类必须在 IoC 中注册(对于类的拦截器,类都必须要注册,当然,拦截器也必须要注册)。
 
示例代码:
var builder = new ContainerBuilder();
builder.RegisterType<First>()
       .EnableClassInterceptors();
builder.Register(c => new CallLogger(Console.Out));

 

 
基于 WCF 的拦截器
 
     WCF 是一种特殊情况。虽然 WCF Proxy 的服务对象也是一种接口,但是使用 EnableInterfaceInterceptors 不会起作用,因为 .NET 实际上是使用了  类似于接口行为的 System.Runtime.Remoting.TransparentProxy 。因此需要这里需要使用  InterceptTransparentProxy() 方法。
 
示例代码:
var cb = new ContainerBuilder();
cb.RegisterType<TestServiceInterceptor>();
cb.Register(c => CreateChannelFactory()).SingleInstance();
cb.Register(c => c.Resolve<ChannelFactory<ITestService>>().CreateChannel())
  .InterceptTransparentProxy(typeof(IClientChannel))
  .InterceptedBy(typeof(TestServiceInterceptor))
  .UseWcfSafeRelease();

 

 
参考文章:

Autofac 之 基于 Castle DynamicProxy2 的 Interceptor 功能

标签:

原文地址:http://www.cnblogs.com/god--love-you/p/5699632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!