[英]autofac, ASP.NET integration, and Dispose
Autofac新手在這里,但我喜歡到目前為止所看到的。 我試圖利用我的解析對象的請求生存期,並且在確認請求完成后是否確實發生了處置方面遇到了麻煩。
我有一個一次性對象,該對象在頁面請求的開始處得到,並在結尾處進行處理。 我現在使用autofac來獲取對象的實例,我想看看autofac是否會為我進行處理。
我已經在有問題的對象上檢測了Dispose()方法,當我的頁面進行生命周期管理時,我可以看到它“啟動”。 當我不處理自己的事務時,我看不出任何證據,而讓autofac做到。
我正在使用這些說明來配置Thign,包括web.config和global.asax更改。 我可以很好地實例化該對象,但是我無法確定它是否真的被廢棄了。 還有其他步驟嗎?
無論是在頁面中手動放置對象還是讓Autofac模塊執行該操作,放置對象的時間都與請求生命周期有關。 在觸發 HttpApplication.EndRequest之前, Autofac ContainerDisposalModule將不會處置Request容器以及您的對象,直到請求生命周期的盡頭。
根據您跟蹤對象Dispose方法的調用的方式,有可能看不到輸出。 您如何檢測Dispose方法?
重發您的重新答案:
在大多數情況下(在任何IoC容器中),您都會發現依賴項鏈中的一個組件是單例。
例如
A-> B-> C
如果A是“工廠”,B是“單人”,C是“工廠”,則解析A將獲得對單例B的引用,該單例B將始終引用相同的C。
為了使您每次解決A時都能創建一個新的C,B也必須是“工廠”。
我想到了!
我在向WRONG容器查詢對象實例-我在向應用程序容器查詢對象,而不是請求容器。
D'哦!
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將被調用。 另外,您可以綁定一個析構函數(如果存在,則由垃圾回收器調用),然后可以將其綁定以調用Dispose方法。 但是如果出於任何原因需要執行此操作,請確保不要兩次釋放相同的資源(釋放后將指針設置為null)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.