当我调用CompositionHost.GetExport<IInterface>("typename")时,我得到了一个请求类型的实例,它实现了IInterface,一切都很正常。
当我调用CompositionHost.GetExports<IInterface>()时,我期望得到一个实现IInterface的所有类型的列表,但结果是一个空集合。
要么是我误解了GetExports()的用途,要么是我错误地实现了一些东西。
我的约定构建如下:
conventions.ForTypesDerivedFrom<IInterface>()
.Export<IInterface>(builder => builder.AsContractName(type => type.Name));我的类型是不带属性实现的,只实现了IInterface。
有没有办法使用以这种方式配置的MEF2来列出类型?或者为了实现这个目标,我需要改变一些东西吗?
发布于 2019-10-01 21:48:58
出口由出口合同描述。
出口合同可以是一种类型,也可以是与合同名称组合的类型。通过使用ExportBuilder.AsContractName方法,您可以显式指定协定名称。因此,您只能通过它们的类型和合同名称来导入这些部件。
您的第一个选项是:不指定合同名称。
conventions.ForTypesDerivedFrom<IInterface>().Export<IInterface>();然后,GetExports<IInterface>()将返回该合约类型的所有实例。但是,您将无法通过GetExport<IInterface>()导入单个实例,因为容器将抛出由多个已知实现引起的异常。
顺便说一下,容器总是返回实例。您编写了期望的类型列表,但只能从容器中获取实例(实例化的部分)列表。要获取类型列表,您需要一个管理零件的目录。根据您的环境,您可能没有访问目录的权限。
如果您仍然希望同时拥有这两个功能(多个实现和单个实现访问),请考虑从契约名称切换到元数据。
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;IDictionary<string, object>是一个通用的元数据视图,允许您访问部件元数据。
https://stackoverflow.com/questions/58183870
复制相似问题