複数の dll があり、いくつかのパラメーターに従って新しい非共有インスタンスを作成したいと考えています。このようなものは私にとっても良いはずですが、作成にはパラメーターを使用して作成するタイプを決定する必要があり、ExportFactory を使用して作成されたインスタンスも破棄できるようにしたいと考えています。
これまでのところ、エクスポートされた dll をロードするコンポーネントがあります。
regisBuilder = new RegistrationBuilder();
regisBuilder.ForType<WPProvider>().Export<WPProvider>();
dirCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory, regisBuilder);
agrCatalog = new AggregateCatalog(dirCatalog);
container = new CompositionContainer(agrCatalog, CompositionOptions.DisableSilentRejection);
container.ComposeParts();
WPProvider は ExportFactory にとって良い仕事だと思いますが、方法がわかりません。今、私はこのクラスを持っています:
public class WPProvider
{
ExportFactory<IDCPlugin> _factory;
[ImportingConstructor]
public WPProvider(ExportFactory<IDCPlugin> factory)
{
_factory = factory;
}
public IDCPlugin CreateInstance()
{
return _factory.CreateExport().Value;
}
}
問題は、さらに dll がある場合、_container.GetExportedValue(); row は、IDCPlugin コントラクトで複数の型を検出したため、CompositionException をスローします。ExportFactory が作成され、必要なときにオブジェクトが提供されると思いました。このように、_provider はすべてのエクスポートを含む IEnumerable になります。しかし、これはどのように工場のように振る舞うのでしょうか?
基本的に、型 (または属性) で選択し、MEF2 ExportFactory と RegistrationBuilder を使用してその型の複数のインスタンスを作成する良い例が必要です。