2013-04-29 7 views
8

Ho un Autofac come un contenitore IoC. Voglio registrare Aspetto per alcuni tipi. Posso fare in questo modo:Autofac, come intercettare il servizio con un'istanza di un Aspetto ma non con il Tipo di Aspetto?

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

Ma cosa succede se ho bisogno di registrare l'intercettore alla certa quantità di classi che utilizzano non è un tipo di intercettore, ma è esempio. Vediamo come penso dovrebbe assomigliare:

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

stavo facendo in modo da utilizzare Ninject CIO. ma che dire di Autofac? Thx per qualsiasi anticipo!

risposta

9

Check out the Autofac wiki page on Autofac.Extras.DynamicProxy2. Essa mostra un esempio di un intercettore CallLogger dove registra un lambda come intercettore:

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

Per caso, solo passare a registrare un'istanza. intercettori

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

In alternativa, è possibile utilizzare nome, se non si vuole il vostro aspetto da essere digitato.

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

Anche in questo caso, check out the wiki - ci sono un sacco di modi per associare l'intercettore con la classe di essere intercettati, tra cui nome, scritte, gli attributi ... un sacco di campioni sul wiki.

+1

Grazie mille, questo aiuta. – Maris