3

我在 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 全部阅读它们才能获得一个具有正确元数据的插件?如果是这样,您如何缓存结果?

4

2 回答 2

3

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

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

于 2009-05-19T20:59:38.313 回答
0

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

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

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

我想MEF仍然必须至少读取所有“数千个插件”的元数据......

于 2010-04-28T20:34:25.810 回答