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

C# 我应该把MEF的接口放在哪里?,c#,mef,C#,Mef,组织项目时,我应该将MEF中使用的提供者接口放在哪里?目前,我只是把它们和其他东西放在同一个项目中,但似乎我希望将它们提取到一个单独的dll中,这样它是一个非常小的dll,其他试图编写扩展的人可以很容易地链接到它。这方面的好做法是什么?与任何插件/扩展模型一样,您应该将“契约”(插件作者应该实现的接口)放在与应用程序分离的程序集中 这样,您就可以使插件作者可以使用该程序集,而不必向他们提供整个应用程序——如果它是一个需要单独许可的商业应用程序,那么这很有用 MEF Preview 5引入了导出接

组织项目时,我应该将MEF中使用的提供者接口放在哪里?目前,我只是把它们和其他东西放在同一个项目中,但似乎我希望将它们提取到一个单独的dll中,这样它是一个非常小的dll,其他试图编写扩展的人可以很容易地链接到它。这方面的好做法是什么?

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

这样,您就可以使插件作者可以使用该程序集,而不必向他们提供整个应用程序——如果它是一个需要单独许可的商业应用程序,那么这很有用


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

最初MEF将实现duck类型,这意味着您不需要一个公共程序集,但显然这太难了


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

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


事实上,.NET4.0中有一个新特性,叫做类型等价,可以实现这一点。使用此功能,您可以在不同的协定程序集中拥有两个不同的接口,它们告诉CLR它们是相同的。因为它是低级的,MEF可以很好地处理它

有几点需要注意:

  • 除了框架类型之外,只支持自定义接口
  • 不支持自定义通用接口
  • 匹配要求两个接口上都有guid:-(

您可以在此处阅读更多信息:。文档会说它是用于COM的,但您也可以将其用于托管代码。

如果您只导入了一种接口类型,则导出该接口效果很好。问题是,如果您希望在应用程序的不同部分中使用两种类型的接口,那么您仍然需要一个合同名称,因此不需要导出语句,对吗?是的,如果你需要导入同一接口的两个不同实现,那么你需要以某种方式区分它们。在实现上需要一个导出属性是一种简单的方法。你可能也可以以某种方式使用导出元数据,但我根本没有使用它。有意思。我到了我自己也有同样的模式,只是我的接口不是一个接口,它是一个抽象类,因为我最终得到了一个通用的、最终的函数作为真实代码。