2012-03-01 12 views
11

tengo autofac creado para hacer la inyección de dependencias de mis controladores de ASP.NET MVC, así:Uso nombrado inscripción en autofac con MVC integración de inyección controlador

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

Y está funcionando bien. Sin embargo, tengo varias implementaciones de una interfaz (por ejemplo, IFoo) que desea registrar como instancias con nombre:

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

y tengo varios controladores que tienen un IFoo en su constructor. Pero cada controlador necesita una implementación concreta diferente de IFoo. ¿Cómo puedo decirle a autofac qué controlador necesita "barra" y cuál necesita "baz"?

Respuesta

22

Puede registrar (en realidad volver a registrarse si está utilizando builder.RegisterControllers()) sus controladores con el parameter que serán utilizados durante la determinación:

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

Si un controlador necesita múltiples IFoo puede especificar el parámetro de decisión, por ejemplo, con nombre (con un poco de sintaxis adicional, pero puede ocultarlo detrás de un método de extensión):

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

Gracias, eso funciona. Ocasionalmente, un controlador necesitará más de un 'IFoo': ¿puedo especificar qué nombre de parámetro va a qué implementación nombrada? –

+0

He actualizado mi respuesta. – nemesv

Cuestiones relacionadas