2012-12-17 5 views
12

Używam Autofac z .Net MVC 3. Wygląda na to, że Autofac rozporządza zasięgiem życia w Application_EndRequest, co ma sens. Ale to powoduje ten błąd, gdy próbuję znaleźć serwis w mój własny kod, który wykonuje podczas EndRequest:Jak mogę używać Autofac w EndRequest?

MESSAGE: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed. 
STACKTRACE: System.ObjectDisposedException 
    at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) 
    at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters) 
    at System.Web.Mvc.DependencyResolverExtensions.GetService[TService](IDependencyResolver resolver) 

Dla porównania, tutaj jest kod używam, aby spróbować rozwiązać usługi:

public T GetInstance<T>() 
    { 
     return DependencyResolver.Current.GetService<T>(); 
    } 

Czy istnieje sposób, że mogę mieć kod, który jest wykonywany z EndRequest skorzystać z Autofac do rozwiązania usługi?

Edycja: Myślałem o zrobieniu tego z osobnym zasięgiem właśnie podczas EndRequest, jak Jim sugeruje poniżej. Oznacza to jednak, że wszelkie usługi zarejestrowane jako InstancePerHttpRequest otrzymają nowe wystąpienie podczas EndRequest, co wydaje się nieidealne.

Odpowiedz

0

Prawdopodobnie będziesz musiał stworzyć swój własny zakres życia. Zakładając, że masz coś takiego w swojej global.asax.cs:

public class MvcApplication : HttpApplication 
{ 
    internal static readonly IContainer ApplicationContainer = InitAutofac(); 
} 

Następnie można zrobić coś takiego w swoim EndRequest:

using (var scope = MvcApplication.ApplicationContainer.BeginLifetimeScope()) 
{ 
    var service = scope.Resolve<Stuff>(); 
    service.DoStuff(); 
} 
+0

zobaczyć moje zmienił powyżej. Działa to, ale najlepiej chciałbym, aby mój kod w EndRequest miał taki sam przedział czasu życia jak mój inny kod, więc 'InstancePerHttpRequest' działa zgodnie z oczekiwaniami. – eliah

+0

Następnie musisz albo uruchomić swój kod przed EndRequest, albo w jakiś sposób podłączyć się bezpośrednio do Autofac, abyś mógł wystrzelić swój kod zanim Autofac się zawiąże. –

Powiązane problemy