2012-12-17 30 views
12

Autofac with .Net MVC 3 kullanıyorum. Autofac'ın ömür boyu kapsama alanını Application_EndRequest uygulamasında kullandığı anlaşılıyor. Ben EndRequest sırasında yürütür kendi kodunda bir hizmet bulmaya Ama bu hataya neden olduğunu:EndRequest'te Autofac'ı nasıl kullanabilirim?

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

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) 

, burada hizmetlerini çözmeye çalışmak için kullanıyorum kodu

EndRequest'ten, hizmet çözünürlüğü için Autofac'ın avantajından yararlanan kodum var mı?

Düzenleme: Jim'in aşağıda önerdiği gibi, bunu yalnızca EndRequest sırasında ayrı bir kapsamla yapmayı düşündüm. Ancak, bu, InstancePerHttpRequest olarak kaydedilen hizmetlerin, ideal olmayan gibi görünen EndRequest sırasında yeni bir örnek alacağı anlamına gelir.

cevap

0

Muhtemelen kendi kullanım ömrü kapsamınızı oluşturmanız gerekecektir.

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

Sonra böyle bir şey yapabileceğini sizin EndRequest yılında:

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

yukarıda benim düzenlemeyi Bkz senin global.asax.cs şey bu var varsayarsak. Bu çalışır, ancak ideal olarak EndRequest'teki kodumun diğer kodumla aynı ömür kapsamına sahip olmasını isterim, böylece 'InstancePerHttpRequest' beklendiği gibi çalışır. – eliah

+0

Ardından, kodunuzu EndRequest'ten önce çalıştırmanız ya da Autofac doğrudan bağlanmanız gerekir, böylece Autofac tamamlanmadan önce kodunuzu tetikleyebilirsiniz. –

İlgili konular