我有一些需要创建多个实例的部分导入。通过四处搜索,我决定我需要使用 ExportFactory 类。不幸的是,默认情况下,ExportFactory 类在 WPF 中不可用,但幸运的是 Glenn Block 已经移植了代码。
最初,我在导入时指定了类型:
[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
WPF ExportFactory<T,T>
?
更新:
有了 Wes 关于添加 .NET 的提示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 网站上找到了一个关于此的讨论,其中对此进行了更多讨论。