簡體   English   中英

autofac,ASP.NET集成和Dispose

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM