C# 如何列出使用MEF2实现接口的所有类型?
当我调用C# 如何列出使用MEF2实现接口的所有类型?,c#,mef,C#,Mef,当我调用CompositionHost.GetExport(“typename”)时,我得到一个请求类型的实例,该实例实现了IInterface,一切正常 当我调用CompositionHost.GetExports()时,我希望得到一个实现IInterface的所有类型的列表,但结果是一个空集合 要么我误解了GetExports()的目的,要么我实现了错误的东西 我的约定如下: conventions.ForTypesDerivedFrom<IInterface>()
CompositionHost.GetExport(“typename”)
时,我得到一个请求类型的实例,该实例实现了IInterface
,一切正常
当我调用CompositionHost.GetExports()
时,我希望得到一个实现IInterface
的所有类型的列表,但结果是一个空集合
要么我误解了GetExports()
的目的,要么我实现了错误的东西
我的约定如下:
conventions.ForTypesDerivedFrom<IInterface>()
.Export<IInterface>(builder => builder.AsContractName(type => type.Name));
conventions.ForTypesDerivedFrom()
.Export(builder=>builder.AsContractName(type=>type.Name));
我的类型是在没有属性的情况下实现的,只实现IInterface
有没有一种方法可以使用以这种方式配置的MEF2列出类型?或者我需要改变一些东西来实现这一点吗?出口合同描述了出口 导出合同可以是类型,也可以是与合同名称组合的类型。通过使用
ExportBuilder.AsContractName
方法,可以显式指定合同名称。因此,您只能按其类型和合同名称导入这些零件
conventions.ForTypesDerivedFrom<IInterface>().Export<IInterface>();
第一个选项是:不要指定合同名称
conventions.ForTypesDerivedFrom<IInterface>().Export<IInterface>();
conventions.ForTypesDerivedFrom().Export();
然后,GetExports()
将返回该合同类型的所有实例。但是,您将无法通过GetExport()
导入单个实例,因为容器将引发由多个已知实现引起的异常
顺便说一下,容器总是返回实例。您编写了一个类型列表,但只能从容器中获取实例(实例化的部分)列表。要获取类型列表,您需要管理零件的目录。根据您的环境,您可能无法访问目录
如果您仍然想要同时具有这两个特性(多个实现和单个实现访问),请考虑从合同名转换为元数据。
conventions
.ForTypesDerivedFrom<IInterface>()
.Export<IInterface>(builder => builder
.AsContractType<IInterface>()
.AddMetadata("ImplementationName", type => type.Name));
var myInstance = container
.GetExports<Lazy<IInterface, IDictionary<string, object>>>()
.Where(v => v.Metadata["ImplementationName"] == "YourImplType")
.FirstOrDefault()?
.Value;
惯例
.fortypesDrivedFrom()
.Export(builder=>builder
.AsContractType()
.AddMetadata(“ImplementationName”,type=>type.Name));
var myInstance=container
.GetExports()
.Where(v=>v.Metadata[“ImplementationName”]==“YourImplType”)
.FirstOrDefault()?
价值
IDictionary
是一个通用元数据视图,允许您访问部件元数据。“您写道,您需要一个类型列表,但只能从容器中获取实例(实例化部件)列表。”谢谢,我输入错误-我指的是实例,所以这对我来说很有效。我想避免使用元数据方法,但我肯定会对此进行探索以提供该功能。
conventions
.ForTypesDerivedFrom<IInterface>()
.Export<IInterface>(builder => builder
.AsContractType<IInterface>()
.AddMetadata("ImplementationName", type => type.Name));
var myInstance = container
.GetExports<Lazy<IInterface, IDictionary<string, object>>>()
.Where(v => v.Metadata["ImplementationName"] == "YourImplType")
.FirstOrDefault()?
.Value;