繁体   English   中英

MEF-[ImportMany]使用ExportFactory <T> 在WPF-.NET 4.0中

[英]MEF - [ImportMany] using ExportFactory<T> in WPF - .NET 4.0

我有一些零件导入,我需要创建这些零件的多个实例。 通过搜索,我决定需要使用ExportFactory类。 不幸的是,默认情况下WPF不能使用ExportFactory类,但是幸运的是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>我就在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`

我在某处(目前无法找到链接)看到在ImportMany属性中指定Type是问题。 我想我可以不用它,所以我从ImportMany删除了该类型。

[ImportMany()]
public IEnumerable<Lazy<IMyModule, IMyModuleMetadata>> Modules { get; set; }

使用Lazy<T,T> ,此导入仍然有效,但是一旦将其更改为ExportFactory<T,T> ,我将不再导入任何内容。 我再也没有收到错误,但是什么也没导入。

有谁知道如何正确地将ImportManyExportFactory<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网站上找到了有关此问题的讨论,其中对此进行了更多讨论。

通常,.NET 4.0出厂时不支持ExportFactory。 ExportFactory是容器(或自定义导出提供程序)了解并特殊对待的特殊类型,并且根据收到的错误消息,它看起来像此容器对ExportFactory并不了解任何特殊信息,因为它正尝试将其强制转换为IMyModule 。

看看Glen对ExportFactory的测试,您是否向容器中添加了Microsoft.ComponentModel.Composition.Hosting.ExportFactoryProvider?

还要注意,如果您可以选择切换到.NET 4.5,则开箱即用地支持ExportFactory。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM