8

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

4

4 回答 4

6

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

这样,您就可以将该程序集提供给插件作者,而无需向他们提供整个应用程序 - 如果它是您需要单独许可的商业应用程序,这将非常有用。

MEF Preview 5 引入了导出接口的能力(即向接口添加 [Export] 属性),以便自动导出该接口的任何实现者。这意味着插件作者甚至不需要了解 MEF - 他们只是实现您的接口,并且它们自动成为 MEF 扩展。

于 2009-04-28T01:43:12.213 回答
2

实际上,.NET 4.0 中有一个称为类型等效的新功能可以实现这一点。使用此功能,您可以在不同的合同程序集中拥有两个不同的接口,告诉 CLR 它们是相同的。因为它是低级的,所以 MEF 可以很好地使用它。

一些警告:

  • 除框架类型外,仅支持自定义接口。
  • 不支持自定义通用接口。
  • 匹配需要两个接口上的 guid :-(

您可以在此处阅读更多相关信息:http: //msdn.microsoft.com/en-us/library/dd997297 (VS.100).aspx 。文档会说它适用于 COM,但您也可以将它用于托管代码。

于 2009-12-22T18:28:32.977 回答
1

最初 MEF 打算实现鸭子类型,这意味着您不需要通用程序集,但显然这被证明太难了。

我将它们全部放在一个通用程序集中,以及一些可用于帮助实现接口的有用抽象基类。

于 2009-05-15T01:28:18.570 回答
0

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

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

于 2009-12-09T08:35:08.193 回答