我有一些实例将在运行时导出,如下所示。
public static IEnumerable<IFileMetaDataProvider> _providers;
[ExportMany(typeof(IFileMetaDataProvider))]
public static IEnumerable<IFileMetaDataProvider> Providers {
get {
if (_providers == null) {
_providers = new IFileMetaDataProvider[2];
}
return _providers;
}
}
将导出的实例将在运行时确定,我不想为每个实例编写代码(因为实例可能会依赖其他导出的接口类型的实例:(),有人可以告诉我如何我可以通过评论方式或编程方式实现这一目标吗?
答案 0 :(得分:1)
您的进出口关系是倒置的。您希望任何实现 IFileMetaDataProvider 的类也导出该接口。
使用这些实现的代码将如下所示
[ImportMany(typeof(IFileMetaDataProvider))]
public static IEnumerable<IFileMetaDataProvider> Providers
如果多个组件导出相同的值,导入属性将引发异常。 ImportMany 将导入一个或多个具有匹配导出属性的组件。
如果实现 IFileMetaDataProvider 的类也具有导入或 ImportMany 属性,那么在合成期间MEF也会满足这些导入。只要目录中存在匹配的导出,您就不必担心导入组件的依赖关系。