Dot-Net

Windsor Container:如何強制處置對象?

  • November 29, 2018

我有一個實現 IDisposable 的對象,該對像在 Windsor Container 中註冊,我想處理它,以便呼叫它的 Dispose 方法,下次呼叫 Resolve 時它會獲取一個新實例。

container.Release(obj); 

立即自動呼叫 Dispose()?還是我需要做

obj.Dispose();
container.Release(obj);

在文件中找不到任何關於 Release 究竟是做什麼的

編輯: 有關我執行的測試結果,請參閱下面的答案。現在問題變成了,如何強制容器釋放具有單例生命週期的組件實例?這只需要在一個地方完成,編寫自定義生命週期似乎太重了,沒有內置的方法嗎?

這是我認為人們在使用 Windsor 容器時並沒有真正意識到這一點——尤其是在核心的生命週期內,容器會一直持有一次性瞬態組件直到它被丟棄,除非你自己釋放它們——儘管如此它被記錄在案 - 看看這裡- 但要快速引用:

MicroKernel 有一個可插拔的發布策略,可以連接並實現一些路由來處理組件。MicroKernel 帶有三個 IReleasePolicy 實現:

  • AllComponentsReleasePolicy:跟踪所有組件以在 MicroKernel 實例處置時強制正確處置
  • LifecycledComponentsReleasePolicy:僅跟踪關聯了退役生命週期的組件
  • NoTrackingReleasePolicy:不執行任何跟踪

您還可以使用介面 IReleasePolicy 實現您自己的發布策略。

您可能會發現更容易將策略更改為NoTrackingReleasePolicy,然後自己處理處置 - 這也有潛在風險,但如果您的生活方式在很大程度上是短暫的(或者當您的容器被處置時,您的應用程序無論如何都將關閉)這可能沒什麼大不了的。但是請記住,任何已經註入單例的組件都將持有一個引用,因此您最終可能會在嘗試“刷新”您的單例時導致問題 - 這似乎是一種不好的做法,我想知道您是否可以避免不得不首先通過改進應用程序的組合方式來做到這一點。

其他方法是使用自己的退役實現來建構自定義生命週期(因此釋放單例實際上會處置組件,就像瞬態生命週期所做的那樣)。

或者,另一種方法是使用單例生活方式在容器中註冊您的服務的裝飾器,但您在容器中註冊的實際底層服務具有瞬態生活方式 - 然後當您需要刷新組件時,只需處置持有的瞬態底層組件由裝飾器替換它並用新解決的實例替換它(使用 components 鍵而不是服務來解決它,以避免獲取裝飾器) - 這避免了其他單例服務(未“刷新”)的問題到陳舊的服務上,這些服務已經被處理使它們無法使用,但確實需要一些鑄造等才能使其工作。

引用自:https://stackoverflow.com/questions/85183