Prism アプリケーションでメモリ リークを引き起こす MEF のパーツ ライフタイムで問題が発生しました。
PartCreationPolicy
私のアプリケーションは、に設定されているビューとビューモデルをエクスポートしますCreationPolicy.NonShared
。ViewBase
ビューとビューモデルはそれぞれとを継承しViewModelBase
、 を実装しIDisposable
ます。
現在、私のパーツは を実装IDisposable
しているため、それらへの参照はコンテナーによって保持されているため、ガベージ コレクターによって解放されません。部品の寿命に関する MEF のドキュメントによると、これは設計によるものです。
コンテナーは、次のいずれかに該当しない限り、作成したパーツへの参照を保持しません。
- パーツは次のようにマークされます
Shared
- 部分は実装します
IDisposable
- 再構成を許可するように 1 つ以上のインポートが構成されています
では、MEF がこれらのパーツへの参照を保持しないようにするにはどうすればよいでしょうか。MEF が実装されていても、自分のパーツへの参照を保持したくないことを MEF に知らせるために使用できる属性はありますIDisposable
か?
上記の記事で説明した両方の戦略は、私にとって良い解決策とは思えません。
ReleaseExport
パラメータとしてオブジェクトが必要ですがExport
、提供方法がわかりません。ビューのインスタンスはありますが、ビューの作成に使用されたコントラクトを知る方法がありません。ReleaseExport
コンテナーによって作成された任意のオブジェクトを受け取ることができるオーバーロードがあれば、それは素晴らしいことです。- 子コンテナーを使用することも、自然な選択肢のようには思えません。
どんな助けでも大歓迎です。