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

时间:2012-09-10 21:40:56

标签: c# wpf mef

我有一些部分导入,我需要创建多个实例。通过搜索我决定我需要使用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>,我就不再导入任何内容了。我没有再收到错误但没有导入任何内容。

是否有人知道如何正确使用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 site找到了关于此问题的讨论,讨论了这个问题。

1 个答案:

答案 0 :(得分:1)

一般情况下,.NET 4.0不支持ExportFactory开箱即用。 ExportFactory是容器(或自定义导出提供程序)专门知道和处理的特殊类型,并且根据您收到的错误消息,它看起来不像这个容器知道任何关于ExportFactory的特殊内容,因为它试图将它强制转换为IMyModule 。

看看Glen对ExportFactory的测试你是否将Microsoft.ComponentModel.Composition.Hosting.ExportFactoryProvider添加到容器中?

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