2012-03-01 3 views
11

ho autofac impostare fino a fare l'iniezione di dipendenza dei miei controllori MVC ASP.NET, in questo modo:Usa nome di registrazione in autofac con MVC integrazione iniezione Controller

System.Web.Mvc.DependencyResolver 
        .SetResolver(new AutofacDependencyResolver(container)); 

E si sta lavorando bene. Tuttavia, ho diverse implementazioni di un'interfaccia (ad esempio, IFoo) che voglio iscrivermi come istanze denominate:

builder.Register<Bar>(c => new Bar()).Named<IFoo>("bar"); 
builder.Register<Baz>(c => new Baz()).Named<IFoo>("baz"); 
... 

E ho diversi controllori che prendono un IFoo nella loro costruttore. Ma ogni controller necessita di una diversa implementazione concreta di IFoo. Come posso dire a autofac di quale controller ha bisogno di "bar" e che ha bisogno di "baz"?

risposta

22

È possibile registrare (in realtà registrare nuovamente se si utilizza builder.RegisterControllers()) i controller con il parameter che saranno utilizzate durante la determinazione:

builder.RegisterType<SomeController>() 
     .WithParameter(ResolvedParameter.ForNamed<IFoo>("bar")); 
builder.RegisterType<OtherController>() 
     .WithParameter(ResolvedParameter.ForNamed<IFoo>("baz")); 

Se un controller di molteplici esigenze IFoo è possibile specificare il parametro di determinazione per esempio con nome (con un po 'di sintassi aggiuntiva, ma puoi nasconderlo dietro un metodo di estensione):

builder.RegisterType<ComplexController>().WithParameters(new [] { 
new ResolvedParameter((p,c) => p.Name == "bar",(p,c) => c.ResolveNamed<IFoo>("bar")), 
new ResolvedParameter((p,c) => p.Name == "baz",(p,c) => c.ResolveNamed<IFoo>("baz")) 
}); 

public class ComplexController: Controller 
{ 
    public ComplexController(IFoo baz, IFoo bar) 
    { 
     //... 
    } 
} 
+0

Grazie, funziona. Occasionalmente un controller ha bisogno di più di un 'IFoo' - posso specificare quale nome del parametro va a quale implementazione nominata? –

+0

Ho aggiornato la mia risposta. – nemesv