2013-04-29 11 views
8

私はIoC容器としてAutofacを持っています。私はいくつかのタイプのAspectを登録したいと思っています。私はこのようにそれを行うことができます。Autofacでは、Aspectのインスタンスでサービスを傍受しますが、Aspectのタイプでは傍受しないでください。

build.RegisterType(myType).As(ImyType).EnableInterfaceInterceptors().InterceptedBy(typeof(Aspect)); 

しかし、私はインターセプタのないタイプを使用して、クラスのいくつかの量にインターセプタを登録する必要がありますが、それは、インスタンスの場合。

Aspect aspectInstance = new Aspect("some data to constructor") 
build.RegisterType(myType).As(ImyType).EnableInterfaceInterceptors().InterceptedBy(aspectInstance); 

私はNinject IoCを使用していました。オートファックはどうですか?任意の進歩のために Thx!

答えて

9

チェックアウトthe Autofac wiki page on Autofac.Extras.DynamicProxy2。あなたのケースのために

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>(); 

、単にインスタンスを登録するには、それを切り替える:それはインターセプタとしてラムダを登録CallLoggerインターセプターの一例を示しています。

var builder = new ContainerBuilder(); 
builder.RegisterType<SomeType>() 
     .As<ISomeInterface>() 
     .EnableInterfaceInterceptors() 
     .InterceptedBy(typeof(Aspect)); 
var interceptor = new Aspect(); 
builder.RegisterInstance(interceptor); 
var container = builder.Build(); 
var willBeIntercepted = container.Resolve<ISomeInterface>(); 

また、アスペクトを入力したくない場合は、名前付きインターセプタを使用することもできます。再び

var builder = new ContainerBuilder(); 
builder.RegisterType<SomeType>() 
     .As<ISomeInterface>() 
     .EnableInterfaceInterceptors() 
     .InterceptedBy("my-aspect-instance"); 
var interceptor = new Aspect(); 
builder.RegisterInstance(interceptor) 
     .Named<IInterceptor>("my-aspect-instance"); 
var container = builder.Build(); 
var willBeIntercepted = container.Resolve<ISomeInterface>(); 

check out the wiki - ウィキ上のサンプルの名前の、型指定された、属性...多く含む傍受されるクラスでインターセプタを関連付ける方法はたくさん、あります。

+1

Thx多く、これは役立ちます。 – Maris

関連する問題