我应该在哪里放置MEF接口?

时间:2009-04-28 01:33:10

标签: c# mef

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

4 个答案:

答案 0 :(得分:6)

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

通过这种方式,您可以为插件作者提供该程序集,而无需为其提供整个应用程序 - 如果它是需要单独许可的商业应用程序,则非常有用。

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

答案 1 :(得分:2)

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

一些警告:

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

您可以在此处详细了解:http://msdn.microsoft.com/en-us/library/dd997297(VS.100).aspx。文档会说它适用于COM,但您也可以将它用于托管代码。

答案 2 :(得分:1)

最初MEF打算实施鸭子打字,这意味着你不需要一个普通的装配,但显然这太难了。

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

答案 3 :(得分:0)

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

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