2012-12-17 13 views
12

私は.Net MVC 3でAutofacを使用しています.Autofacは、Application_EndRequestで有効期間のスコープを破棄しているようです。参考のためにEndRequestでAutofacを使用するにはどうしたらいいですか?

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) 

、ここで私はサービスを解決しようとするために使用しているコードだ:しかし、それは私がEndRequestの間に実行される自分のコードでサービスを見つけるためにしようとすると、このエラーを引き起こして

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

サービスの解決のためにAutofacを利用するEndRequestから実行されるコードを作成する方法はありますか?

編集:Jimが以下に示すように、EndRequestの間だけ別のスコープでそれを行うことを考えました。しかし、これは、InstancePerHttpRequestとして登録されているサービスは、EndRequestの間に新しいインスタンスを取得することになり、非理想的と思われます。

答えて

0

おそらくあなた自身のライフタイムスコープを作成する必要があります。

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

次に、あなたがあなたのEndRequestにこのような何かを行うことができます:

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

上記の私の編集を参照してくださいあなたはこのあなたのglobal.asax.csで何かを持っていると仮定。これはうまくいきますが、理想的には、EndRequestのコードで他のコードと同じ有効期間を持つようにして、 'InstancePerHttpRequest'が期待どおりに動作するようにしたいと思います。 – eliah

+0

その後、EndRequestの前にコードを実行するか、何とかAutofacに直接フックして、Autofacが終了する前にコードを起動させる必要があります。 –

関連する問題