使用MEF Preview 5导入具有特定元数据的零件

时间:2009-05-19 17:35:07

标签: c# mef

我在MEF预览5中定义了如下导出

[ExportMetadata("Application", "CheckFolderApplication")]
[Export(typeof(ExtendedArtifactBase))]
public class CheckFolderArtifact2 : ExtendedArtifactBase
{ ...

然后我希望那些带有“Application”“CheckFolderApplication”元数据的导入。为了做到这一点,我读了所有导入,然后过滤结果。

[Import(typeof(ExtendedApplicationBase))]
private ExportCollection<IApplication> _applications { get; set; }

public IApplication GetApplication(string applicationName)
{
    return _applications.Single(a => a.GetExportedObject().Name == applicationName).GetExportedObject();
 }

这感觉非常低效。如果我有数以千计的插件怎么办?我是否必须通过MEF阅读它们才能获得具有正确元数据的插件?如果是这样,你如何缓存结果?

2 个答案:

答案 0 :(得分:3)

是的,在这种情况下,您必须自己进行过滤。

要缓存结果,您只需将其存储在另一个私有变量中即可。如果要支持重构(您必须将import属性的AllowRecomposition属性设置为true),则可以在类上实现IPartImportsSatisfiedNotification,并且只要设置了导入,就会调用接口的OnImportsSatisfied方法。

答案 1 :(得分:0)

我发现自己想要做类似的事情。我最终导入了Lazy并对元数据进行了过滤,希望这是一种避免提前实例化实际对象的方法。

[ImportMany(typeof(MyInterface))]
List<Lazy<MyInterface,MyMetadataType>> MyGuys { get; set; }

(使用强类型元数据 - 我还使用了一个功能,您可以在其中创建具有只读获取的MyMetadataType接口,并传递而不是设置TMetadata = IDictionary)

我想MEF仍然必须至少阅读所有'千插件'的元数据,但是......