首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何列出使用MEF2实现接口的所有类型?

如何列出使用MEF2实现接口的所有类型?
EN

Stack Overflow用户
提问于 2019-10-01 19:27:46
回答 1查看 96关注 0票数 1

当我调用CompositionHost.GetExport<IInterface>("typename")时,我得到了一个请求类型的实例,它实现了IInterface,一切都很正常。

当我调用CompositionHost.GetExports<IInterface>()时,我期望得到一个实现IInterface的所有类型的列表,但结果是一个空集合。

要么是我误解了GetExports()的用途,要么是我错误地实现了一些东西。

我的约定构建如下:

代码语言:javascript
复制
conventions.ForTypesDerivedFrom<IInterface>()
           .Export<IInterface>(builder => builder.AsContractName(type => type.Name));

我的类型是不带属性实现的,只实现了IInterface

有没有办法使用以这种方式配置的MEF2来列出类型?或者为了实现这个目标,我需要改变一些东西吗?

EN

回答 1

Stack Overflow用户

发布于 2019-10-01 21:48:58

出口由出口合同描述。

出口合同可以是一种类型,也可以是与合同名称组合的类型。通过使用ExportBuilder.AsContractName方法,您可以显式指定协定名称。因此,您只能通过它们的类型和合同名称来导入这些部件。

您的第一个选项是:不指定合同名称。

代码语言:javascript
复制
conventions.ForTypesDerivedFrom<IInterface>().Export<IInterface>();

然后,GetExports<IInterface>()将返回该合约类型的所有实例。但是,您将无法通过GetExport<IInterface>()导入单个实例,因为容器将抛出由多个已知实现引起的异常。

顺便说一下,容器总是返回实例。您编写了期望的类型列表,但只能从容器中获取实例(实例化的部分)列表。要获取类型列表,您需要一个管理零件的目录。根据您的环境,您可能没有访问目录的权限。

如果您仍然希望同时拥有这两个功能(多个实现和单个实现访问),请考虑从契约名称切换到元数据。

代码语言:javascript
复制
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>是一个通用的元数据视图,允许您访问部件元数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58183870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档