6

Castle Windsor を使用して、一時的なライフスタイルで構成されたコンポーネントを作成しました。

<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 ... 

私の質問は、サービス インスタンスが範囲外になった後にガベージ コレクションされるのか、それともキャッスル ウィンザーが参照を保持するのかということです。これは、後者が当てはまる可能性があることを意味します-しかし、そこに投稿されたリンクを調べた後、議論が参照を保持することに関するものなのか、それとも IDisposable を実装する場合にオブジェクトが破棄されることを保証することに関するものなのかわかりません. オブジェクトを破棄する必要はありません。

ウィンザー城がインスタンスを保持している場合、これを防ぐ簡単な方法はありますか (おそらく構成によって) ?

編集
リリース追跡ポリシーを設定する必要があるようです。これは xml 構成ファイルで構成できますか、それともコードで設定する必要がありますか? コンポーネントごとにリリース追跡ポリシーを設定できますか?

4

2 に答える 2

9

デフォルトでは、コンテナーはオブジェクトへの参照を保持します (一時的なものも含む)。

ただし、@Bittercoder が「Why does Castle Windsor hold on transient objects?」で指摘しているように、、リリース追跡ポリシーを変更できます。選ぶそうです

LifecycledComponentsReleasePolicy:

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

しかし、質問が出されて以来、それがデフォルトのポリシーになっているようです。

于 2009-02-23T18:09:42.207 に答える
1

注意すべきことの 1 つは、これがキャッスル トランクで修正されたように見えることです。r5475 で、Hammett は MicroKernel のデフォルトのリリース ポリシーを LifecycledComponentsReleasePolicy に変更しました。

于 2009-03-25T17:40:20.793 に答える