MEF:如果我有多个导出,但只需要一个导入怎么办?

13

我正在努力理解MEF。

有一件事我不明白,假设我有一个名为ISomething的接口,它是一个合约,在一个文件夹中包含了多个程序集,而我并不知道其中有多少个实现了ISomething接口的程序集,也不知道哪个程序集包含了这个接口的实现。

如果我创建一个使用MEF的主机应用程序,并想要获取一个ISomething接口的实例,但只需要一个,那么MEF如何决定将给我哪个实现?

或者类似于通用的IoC容器,我该如何告诉它应该使用哪个实现?

感谢您提前的回答。

2个回答

14

请查看此博客文章,讨论该问题以及您可以选择的一些选项。此外,Glenn Block撰写了一篇博客文章,介绍如何使用默认值自定义容器行为


1
Glenn关于ExportProviders的帖子给了我一个好主意。也许我应该创建一个ExportProvider,可以接受某种配置,在其中可以指定默认导出。 - Venemo
1
这是非常合理的,而且这也是我们考虑过的情况之一。 - Glenn Block

11

对于MEF而言,如果您有许多可满足导入的输出,则有两个选择:

  1. 更改您的导入以使用[ImportMany]。在运行时决定使用哪个导入项来满足您的契约,可能只选择第一个或随机选择一个。
  2. 结合元数据使用[ImportMany],以便决定要使用哪个导入项。

这是一个好主意,不过我更喜欢像在温莎那样从配置中指定具体实现,并告诉MEF使用它。 - Venemo
@Venemo:你应该能够在运行时使用元数据来完成这个任务。 - Scott Whitlock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接