2

私は部品の寿命と所有権に頭を悩ませようとしています。共有パーツの存続期間はコンテナーにスコープされます。しかし、非共有インスタンスはどうですか?コンテナは、共有されるかIDisposableを実装しない限り、作成されたパーツへの参照を保持しないと述べていますが、コンテナによって作成されたすべてのパーツはコンテナの存続期間に合わせて調整されており、それらを取り除く唯一の方法は、容器。

それで、それはどれですか?コンテナは、作成するすべてのパーツへの参照を保持していますか、それとも特定の条件に適合するパーツのみを保持していますか?また、コンテナが作成したパーツの所有権を譲渡することはないと言っているので、私は混乱しています。しかし、共有されていない部分(IDispoableを実装していない)への参照を保持していない場合、実際には所有権を要求者に譲渡しているのではないでしょうか。

ソース: http: //mef.codeplex.com/wikipage?title = Parts %20Lifetime&referringTitle = Guide

4

1 に答える 1

2

管理されていない言語の観点から「生きている」と考えるとき、あなたの異議は理にかなっています。たとえば、C ++では、ヒープに割り当てられているオブジェクトは、ある時点で解放する必要があり、それがコンテナの責任になります。したがって、コンテナは、作成したすべてのオブジェクトへの参照を保持し、ある時点でそれらを解放する必要があります。

ただし、.NETランタイムでは、ガベージコレクターがメモリの再利用を処理します。したがって、コンテナは、パーツの将来のリクエストを処理するときに再利用される可能性がある場合(つまり、共有される場合)、またはある時点で破棄する必要がある場合にのみ、インスタンスへの参照を保持する必要があります。

これらの条件のどちらも当てはまらない場合は、存続期間と所有権の概念を安全に無視できます。重要なのは、オブジェクトへの参照がある限りオブジェクトが使用可能であり、ガベージコレクターがそれを確認することです。

だからあなたの質問に答えるために:それは特定の条件に合うオブジェクトへの参照だけを保持します。ただし、それは、呼び出しを続けてcontainer.GetExportedValueメモリリークが発生しないことを期待できるという意味ではありません。要求する使い捨てでないオブジェクトに使い捨ての依存関係がある場合はどうなるかを考えてください。コンテナは引き続きそれらへの参照を保持します!

したがって、コンテナを介してオブジェクトを動的に作成する場合は、ExportFactory代わりに使用するのが最適です(.NET 4.5で導入)。このようにして、オブジェクトが使い捨てでない場合でも「ライフタイム」の概念を再導入できます。コンテナーは、でシグナルを送信すると、共有されていない依存関係を確実にクリーンアップしますExportLifetimeContext<T>.Dispose

于 2012-06-11T11:07:03.113 に答える