2012-03-01 8 views
11

mam autofac skonfigurować zrobić zastrzyk zależności od moich kontrolerami asp.net MVC, tak:Zastosowanie nazwie rejestracja w autofac z MVC integracji wtrysku sterownik

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

i działa dobrze. Mam jednak kilka implementacje interfejsu (powiedzmy, IFoo), które chcę, aby zarejestrować się jako nazwanych wystąpień:

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

I mam kilka kontrolerów, które biorą IFoo w ich konstruktora. Ale każdy kontroler potrzebuje innej konkretnej implementacji IFoo. Jak mogę powiedzieć autofacowi, który kontroler potrzebuje "paska" i który potrzebuje "baz"?

Odpowiedz

22

Możesz zarejestrować się (a właściwie ponownie zarejestrować jeśli używasz builder.RegisterControllers()) kontrolery z parameter które będą wykorzystywane podczas determinacji:

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

Jeśli kontroler wymaga wielokrotnego IFoo można określić parametr resolve np z nazwą (z niewielką dodatkową składnią, ale możesz ją ukryć za metodą rozszerzenia):

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

Dzięki, to działa. Od czasu do czasu kontroler będzie potrzebował więcej niż jednego 'IFoo' - czy mogę określić, która nazwa parametru przechodzi do nazwanej implementacji? –

+0

Zaktualizowałem swoją odpowiedź. – nemesv

Powiązane problemy