2011-10-20 13 views
20

Chciałbym rozwiązać zależności przy użyciu nazwanego parametru w kontroler MVC. Jeśli mogę otworzyć pojemnik Autofac powinienem być w stanie to zrobić tak:Jak uzyskać dostęp do kontenera autofac w kontrolerze ASP.NET MVC3?

var service = Container.Resolve<IService>(
    new NamedParameter("fileExtension", dupExt) 
); 

nie mogę dowiedzieć się, jak uzyskać dostęp do pojemnika AutoFac. Czy istnieje globalne odniesienie do kontenera, którego mogę użyć lub czy istnieje inny sposób używania nazwanych parametrów?

Odpowiedz

30

Właśnie odkryłem, że mogę użyć IComponentContext dla tego samego. Możesz wprowadzić instancję IComponentContext do kontrolera.

public class MyController : Controller 
{ 
    private readonly IComponentContext _icoContext; 

    public void MyController(IComponentContext icoContext) 
    { 
     _icoContext= icoContext; 
    } 

    public ActionResult Index() 
    { 
     var service = _icoContext.Resolve<IService>(
      new NamedParameter("ext", "txt") 
     ); 
    } 
} 

Znalazłem kilka dobrych rad na uzyskanie globalnego dostępu do pojemnika w tej kwestii: Autofac in web applications, where should I store the container for easy access?

Ja również znaleźć sposób, aby uzyskać dostęp do rezolwerem zależność tutaj globalnie: Global access to autofac dependency resolver in ASP.NET MVC3?

+2

Nie powinieneś tego robić. To zła praktyka. Zamiast podejścia do lokalizatora usług lepiej jest wykonać iniektor konstruktora. Po prostu wstrzyknij IService do konstruktora i użyj wstrzykniętego instace jako pola klasy – Wojteq

+1

Jak mogę używać nazwanych parametrów przy takim podejściu? –

+2

Możesz uzyskać coś podobnego za pośrednictwem delegata Factory: http://code.google.com/p/autofac/wiki/DelegateFactories – Wojteq

12
AutofacDependencyResolver.Current.ApplicationContainer 

.Resolve 

.ResolveNamed 

.ResolveKeyed 

..... 
+14

Być może zechcesz nieco poprawić swoją odpowiedź. Opublikowanie kilku nazw nie jest pomocne dla większości ludzi. –

+4

Myślę, że jego odpowiedź naprawdę pomaga. Mój problem został rozwiązany dzięki tej odpowiedzi. –

Powiązane problemy