我有一些部分导入,我需要创建多个实例。通过搜索我决定我需要使用ExportFactory类。遗憾的是,默认情况下,ExportFactory类在WPF中不可用,但幸运的是Glenn Block有ported the code。
最初,我在导入时指定了类型:
[ImportMany(typeof(IMyModule))]
public IEnumerable<Lazy<IMyModule, IMyModuleMetadata>> Modules { get; set; }
我还创建了一个导出属性:
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
public class ExportMyModuleMetadata : ExportAttribute, IMyModuleMetadata
{
public ExportMyModuleMetadata(string category, string name)
: base(typeof(IMyModuleData))
{
Category = category;
Name = name;
}
public string Category { get; set; }
public string Name { get; set; }
}
我的导出如下:
[ExportMyModuleMetadata("Standard","Post Processor")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class Module1 : IMyModuleData
以上导入工作正常。但是,一旦我将Lazy<T,T>
更改为ExportFactory<T,T>
,我就开始在合成期间收到错误。
[ImportMany(typeof(IMyModule))]
public IEnumerable<ExportFactory<IMyModule, IMyModuleMetadata>> Modules { get; set; }
我得到的错误信息是:
The export 'Module1 (ContractName="IMyModule")' is not assignable to type
'System.ComponentModel.Composition.ExportFactory`
我在某处找到了(我现在找不到链接),指定Type
属性中的ImportMany
是问题所在。我想我可以不用它,所以我从ImportMany
删除了类型。
[ImportMany()]
public IEnumerable<Lazy<IMyModule, IMyModuleMetadata>> Modules { get; set; }
使用Lazy<T,T>
时此导入仍然有效,但是一旦我将其更改为ExportFactory<T,T>
,我就不再导入任何内容了。我没有再收到错误但没有导入任何内容。
是否有人知道如何正确使用ImportMany
与ExportFactory<T,T>
进行WPF?
更新
根据Wes关于添加ExportFactoryProvider()
的提示,我得到ExportFactory<T,T>
在.NET 4中工作!以下是更新的组合代码。
var ep = new ExportFactoryProvider();
//Looks for modules in main assembly and scans folder of DLLs for modules.
var moduleCatalog = new AggregateCatalog(
new AssemblyCatalog(runningApp),
new DirectoryCatalog(".", "*.dll"));
var container = new CompositionContainer(moduleCatalog, ep);
ep.SourceProvider = container;
var Modules = new Modules();
container.ComposeParts(Modules);
我还在MEF Codeplex site找到了关于此问题的讨论,讨论了这个问题。
答案 0 :(得分:1)
一般情况下,.NET 4.0不支持ExportFactory开箱即用。 ExportFactory是容器(或自定义导出提供程序)专门知道和处理的特殊类型,并且根据您收到的错误消息,它看起来不像这个容器知道任何关于ExportFactory的特殊内容,因为它试图将它强制转换为IMyModule 。
看看Glen对ExportFactory的测试你是否将Microsoft.ComponentModel.Composition.Hosting.ExportFactoryProvider添加到容器中?
另请注意,如果您可以选择切换到.NET 4.5,则开箱即用支持ExportFactory。