2014-10-09 108 views
2

我似乎無法找到一個答案,在文檔或計算器這個問題(雖然我可能忽略了它)。我很好奇,是否應該手動處理由ContainerBuilder提供的IContainer?Autofac - 我需要在MVC global.asax中手動處理IContainer嗎?

下面是Remember.Web一個代碼示例:

//etc.. 
IContainer container = builder.Build();//returns IDisposable instance 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
//etc.. 

,但我很好奇,如果它應該是這樣的:

public class MvcApplication : HttpApplication 
{ 
    private IContainer container;//not necessary..? 

    protected void Application_Start() 
    { 
     ///etc.. 
     this.container = builder.Build();//returns IDisposable instance 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
     //etc.. 
    } 
    protected void Application_End() 
    { 
     container.Dispose(); 
    } 
} 

請你點我到正確的文檔,如果我俯視着東西,謝謝!

回答

4

當使用一次性的工作,該模式是,你總是應該儘快處置的對象作爲你用它做。所以我會說是,明確表示它。文件和樣品應該提到這一點。

如果不手動配置儲藏,它會被釋放在AppDomain被卸載後,由GC(以及任何包含的情況下)一段時間。

注意: as @Steven提到,Dispose方法在垃圾回收期間不會被調用。因此,您可能在Dispose方法中執行的任何邏輯都不會執行。因此,處置容器是否具有任何意義取決於容器所擁有的實例。同樣,明確地調用Application_End中的Dispose將確保沒有這樣的邏輯丟失。

也就是說,如果你在你的容器需要處理服務,您可能希望這些註冊移動請求範圍。這確保了一次性實例的生存時間與請求一樣長。請求生命週期範圍由Autofac集成模塊處理,因此您不需要執行任何操作來執行清理。

+0

這是不完全正確。如果AppDomain死亡,運行時將運行所有仍需要最終確定的對象的所有終結器。所以這意味着任何非託管資源(文件句柄,db連接,對本機內存的引用,GDI +映像)都會被清除。但垃圾收集器不會爲您調用任何「Dispose」方法。因此,如果你在一個不在終結器中的dispose方法中做更多事情(例如對數據庫進行一些最終的記錄),那麼代碼將無法運行。 – Steven 2014-10-09 21:04:35

+1

@Steven - 謝謝,你真是太棒了。我澄清了這一點。 – 2014-10-10 10:08:18

相關問題