我有多个dll,我想根据一些参数创建新的非共享实例。 Something like this也应该对我有好处,但是创建应该使用参数来决定要创建哪种类型,并且我也希望使用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抛出一个CompositionException,因为它使用IDCPlugin契约创建了多个类型。我认为ExportFactory已经创建,并在我需要时为我提供了对象。 这样_provider就是一个包含所有导出的IEnumerable。 但这如何像工厂一样?
基本上我需要一个很好的例子,通过类型(或属性)进行选择,并使用MEF2 ExportFactory和RegistrationBuilder创建该类型的多个实例。