我应该把MEF的接口放在哪里?

8

当组织一个项目时,我应该把用于MEF的提供程序接口放在哪里?目前,我只是将它们放在与其他所有内容相同的项目中,但似乎将它们提取到单独的dll中可能是可取的,这样它就是一个非常小的dll,并且很容易被其他尝试编写扩展的人链接。对此有什么好的做法吗?

4个回答

6

与任何插件/扩展模型一样,您应该将“契约”(插件作者应实现的接口)放在一个与应用程序分开的程序集中。

这样,您就可以使该程序集对于插件作者可用,而无需提供整个应用程序,如果它是需要单独许可的商业应用程序,则非常有用。

MEF预览5引入了导出接口的功能(即向接口添加[Export]属性),以便任何实现该接口的对象都可以自动导出。这意味着插件作者甚至不需要知道MEF - 他们只需要实现您的接口,就自动成为MEF扩展。


如果您只导入一种类型,则导出接口的效果很好。问题是,如果您想在应用程序的不同部分中使用两个该类型,则仍需要合同名称,因此您仍需要导出语句,对吗? - Scott Whitlock
是的,如果您需要导入同一接口的两个不同实现,则需要以某种方式区分它们。在实现上要求一个Export属性是一种简单的方法。您也可以以某种方式使用导出元数据,但我还没有尝试过。 - Matt Hamilton

2
实际上,在 .NET 4.0 中有一个名为类型等效性的新功能,可以实现这一点。使用此功能,您可以在不同的契约程序集中拥有两个不同的接口,并告诉 CLR 它们是相同的。由于它是低级别的,因此 MEF 可以很好地与其配合使用。
但需要注意以下几点:
- 除了框架类型外,只支持自定义接口。 - 不支持自定义通用接口。 - 匹配需要接口上的 guid :-(
您可以在此处阅读更多信息:http://msdn.microsoft.com/en-us/library/dd997297(VS.100).aspx。文档会说它是用于 COM 的,但您也可以将其用于托管代码。

1

最初MEF要实现鸭子类型,这意味着您不需要一个公共程序集,但显然这证明过于困难。

我将它们都放在一个公共程序集中,还包括一些有用的抽象基类,可以用来帮助实现接口。


有趣。我独立也想到了同样的模式。只不过我的接口不是接口,而是抽象类,因为我最终将一个通用的终极函数作为实际代码。 - JCCyC

0
我也有同样的问题,想看一个示例,其中合同在一个项目中定义,多个实现在其他项目中定义,而单独的消费者项目使用合同,并具有扩展文件夹,可以简单地复制实现dll并在消费者应用程序中使用,而无需进行任何代码更改。因此,我尝试编写了一个简单的“Hello World”应用程序,并在我的博客上发布了它。希望你会发现它有用。我还发布了源代码(使用C#)。

http://ppsinfo.blogspot.com/2009/11/managed-extensibility-framework-mef.html


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