2009-02-23 38 views
6

使用溫莎城堡,我有瞬間的生活方式配置的一個組成部分:溫莎城堡:我的瞬態成分是否會被垃圾收集?

<component id="publish.mapping.default" 
        service="IMyService, MyAssembly" 
        type="MyServiceImplementation, Myassembly" 
        lifestyle="transient" /> 

這將是這樣使用:

var service = container.Resolve<IMyService>(componentId); 
// service usage .... 
// service goes out of scope ... 

我的問題是,將服務實例後,垃圾回收超出範圍,或將溫莎城堡舉行參考?我發現this similar question,這意味着後者可能是這種情況 - 但在檢查了張貼在那裏的鏈接之後,我不確定討論是關於引用還是關於確保在實現IDisposable時丟棄該對象。我的物品不需要丟棄。

如果溫莎城堡堅持實例,是否有任何簡單的方法來防止這種情況(可能通過配置)?

編輯
看來,我需要設置發佈跟蹤政策。這可以在xml配置文件中配置,還是需要在代碼中設置?發佈跟蹤策略是否可以基於每個組件設置?

回答

9

默認情況下,容器包含對象的引用(即使是瞬態對象)。

但是,由於@Bittercoder在Why does Castle Windsor hold onto transient objects?中註釋,您可以change the release tracking policy。如此看來,選擇

LifecycledComponentsReleasePolicy

var policy = container.Kernel.ReleasePolicy; 
container.Kernel.ReleasePolicy = LifecycledComponentsReleasePolicy; 

但既然有人問,這似乎已經成爲了默認的策略。

+0

謝謝。你知道這是否可以在每個組件的基礎上配置? (請參閱編輯我的問題) – driis 2009-02-23 18:44:02

+0

我不這麼認爲。我實際上並沒有使用Castle(我想),但文檔似乎表明它是內核範圍的。我不知道這是否是正確的做法,但可能會添加一個關注組件類型的自定義策略... – 2009-02-23 20:57:11

1

有一點要注意的是,這似乎已被修復在城堡樹幹。在r5475中,Hammett將MicroKernel中的默認釋放策略更改爲LifecycledComponentsReleasePolicy。