2009-09-02 66 views
1

Autofac新手在這裏,但我喜歡我目前看到的。我試圖利用我已解析對象的請求生命週期,並且在請求完成後我確實遇到了處理確實發生的問題。autofac,ASP.NET集成和Dispose

我有一個可處理的對象,我在頁面請求開始時獲得並在最後處置。我現在使用autofac來獲取對象的一個​​實例,並且我想看看autofac是否會爲我處置。

我已經在有問題的對象上安裝了Dispose()方法,當我的頁面進行生命週期管理時,我可以看到它'啓動'。當我不處理自己,但讓autofac做到這一點時,我看不到任何證據。

我使用these指令來配置thigns,包括web.config和global.asax更改。我能夠實例化對象,但我不知道它是否真的被處置。有沒有另一個步驟?

回答

1

我想通了!

我在問WRONG容器的對象實例 - 我問的應用程序容器的對象,而不是請求容器。

D'oh!

+1

是的,這個問題通常很好解決。我通常使用更多的DI設施,而不是服務定位器設施,所以我不會遇到這種情況。有一次,我有一個nhibernate ISession被鎖定我的開發數據庫...很多樂趣。 – Min 2009-10-08 13:38:56

0

Dispose只不過是一個允許您定義「Dispose」方法的接口。需要一次性類的最常見用法是應該明確釋放該類中的資源(如Windows資源句柄)。在大多數情況下,IDisposable接口不是必需的,因爲垃圾收集器非常強大,並且在管理內存方面做得更好。然而,顯然有很多情況下處理程序必須立即釋放,這使我進入下一個要點,實現IDisposable。

什麼不該做的事:

var myClass = MyDisposableClass(); 

// do stuff with myClass 

myClass.Dispose(); 


Proper usage: 

using (var myClass = MyDisposableClass()) 
{ 
    // do stuff with myClass 
} 

編譯器將有效地建立同爲以下幾點:

MyDisposableClass myClass = MyDisposableClass(); 
try 
{ 
    // do stuff with myClass 
} 
finally 
{ 
    myClass.Dispose(); 
} 

最重要的區別是,不管發生什麼事,你知道你的處置將獲得調用。此外,您可以綁定一個析構函數(如果存在,則由垃圾收集器調用),然後您可以調用Dispose方法;但是如果你爲了任何原因需要這樣做,一定不要釋放相同的資源兩次(釋放後將你的指針設置爲null)。

+0

感謝您抽出時間。我知道dispose是如何工作的。我的目標是能夠交換進出的實現,而頁面不必知道它們是否是一次性的。 Autofac的子容器生命週期管理應該這樣做,ASP.NET集成應該在請求的整個生命週期中進行管理。我只是想確認它實際上正在發生。 – n8wrl 2009-09-02 20:46:57

1

無論您是在頁面中手動處理對象還是讓Autofac模塊執行此操作,在您的對象相對於請求生命週期處置時,都會有所不同。 The Autofac ContainerDisposalModule將不會dispose the Request container,並與您的對象,直到HttpApplication.EndRequest被觸發,這是在請求生命週期的最後。

取決於您如何跟蹤調用對象的Dispose方法,可能有可能看不到輸出。你如何檢測你的Dispose方法?

+0

偉大的問題,彼得 - 我試過三件事。前兩個顯示什麼都沒有 - response.write和httpcontext.trace,兩者都可以通過時間來解釋。但第三個是事件日誌寫作,也沒有顯示任何內容。 – n8wrl 2009-09-03 11:25:28

+0

我同意。跟蹤事件日誌不應受到請求生命週期的影響。嗯。 – 2009-09-03 12:24:55

1

答案重複從您的重職:

大部分發生這種情況(在任何 IoC容器)的時候,你會發現,沿着 依賴關係鏈一個 組件是單身。

E.g.

A - >乙 - 「ç

如果A是 '工廠',B是 '單' 和C是 '工廠',然後解析 會得到一個參考單 B,其總是引用 相同C.

爲了使新的C讓每一個你解決時創建 ,B也 必須是「工廠」。