我在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阅读它们才能获得具有正确元数据的插件?如果是这样,你如何缓存结果?
答案 0 :(得分:3)
是的,在这种情况下,您必须自己进行过滤。
要缓存结果,您只需将其存储在另一个私有变量中即可。如果要支持重构(您必须将import属性的AllowRecomposition属性设置为true),则可以在类上实现IPartImportsSatisfiedNotification,并且只要设置了导入,就会调用接口的OnImportsSatisfied方法。
答案 1 :(得分:0)
我发现自己想要做类似的事情。我最终导入了Lazy并对元数据进行了过滤,希望这是一种避免提前实例化实际对象的方法。
[ImportMany(typeof(MyInterface))]
List<Lazy<MyInterface,MyMetadataType>> MyGuys { get; set; }
(使用强类型元数据 - 我还使用了一个功能,您可以在其中创建具有只读获取的MyMetadataType接口,并传递而不是设置TMetadata = IDictionary)
我想MEF仍然必须至少阅读所有'千插件'的元数据,但是......