2012-12-17 15 views
12

Sto utilizzando Autofac con .Net MVC 3. Sembra che Autofac disponga dello scope di durata in Application_EndRequest, il che ha senso. Ma che sta causando questo errore quando provo a trovare un servizio nel mio codice che viene eseguito durante EndRequest:Come posso utilizzare Autofac in 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) 

Per riferimento, ecco il codice che sto usando per cercare di risolvere i servizi:

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

C'è un modo in cui posso avere codice che viene eseguito da EndRequest approfittare di Autofac per la risoluzione del servizio?

Modifica: ho pensato di farlo con un ambito separato solo durante EndRequest, come suggerisce Jim di seguito. Tuttavia, ciò significa che tutti i servizi registrati come InstancePerHttpRequest avranno una nuova istanza durante EndRequest, che sembra non ideale.

risposta

0

Probabilmente dovrai creare il tuo ambito di vita. Supponendo di avere qualcosa di questo nel vostro global.asax.cs:

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

allora si potrebbe fare qualcosa di simile nel tuo EndRequest:

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

Vedi la mia modifica di cui sopra. Funziona, ma idealmente vorrei che il mio codice in EndRequest avesse lo stesso ambito di durata del mio altro codice, in modo che 'InstancePerHttpRequest' funzioni come previsto. – eliah

+0

Quindi dovrai eseguire il tuo codice prima di EndRequest, o in qualche modo collegarti direttamente ad Autofac in modo che tu possa sparare il tuo codice prima del completamento di Autofac. –

Problemi correlati