PrismやMEFではなく、Dependency Injectionの原則やベストプラクティス全般に対応していると思います。(ええ、私は MEF が DI コンテナーではないことを結びますが、ここではほとんど DI コンテナーとして使用されるため、ここで同じプラクティスを使用すると思います)。
DI のベスト プラクティス (この本は非常にクールです。強くお勧めします) では、DI の「ワークフロー」に次のような手順を含めることをお勧めします。
- 必要なすべてのタイプを登録します (Prism で - Bootstrapper.ConfigureCatalog() メソッドによる)
- ルート オブジェクトを解決します (すべてのネストされたオブジェクトを含む。Prism では - Bootstrapper.CreateShell() メソッドによる)
- ルートオブジェクトを使用する
- ルートオブジェクトを解放する
理想的には、DI コンテナーはもう使用しないでください。あなたのコードは DI コンテナの存在を認識すべきではありません (この点から見ると、Unity は実際には DI コンテナです。なぜなら、DI コンテナの使用を認識しないコードを書くことができるからです)。あなたのコードがそれを知っている場合 - それは DI コンテナに依存しており、悪いことです。
PS。とにかくモジュールで MEF コンテナーを使用したい場合 (たとえば、DI パラダイムにあまり慣れていないか、非常に特殊なタスクがあるため)、次のようなことを試すことができます。
[ModuleExport(typeof(YourModule))]
public class YourModule : IModule
{
public static CompositionContainer CompositionContainer;
[ImportingConstructor]
public void YourModule(CompositionContainer container)
{
this.CompositionContainer = container;
}
}
MEF コンテナー自体を Boostrapper に登録することを忘れないでください。
public class YourBootstrapper: MefBootstrapper
{
protected override CompositionContainer CreateContainer()
{
var container = base.CreateContainer();
container.ComposeExportedValue(container);
return container;
}
}