在组织项目时,我应该将 MEF 中使用的提供程序接口放在哪里?目前我只是将它们与其他所有东西放在同一个项目中,但似乎我可能希望将它们提取到一个单独的 dll 中,这样它是一个非常小的 dll,并且很容易被其他尝试编写扩展的人链接到。这有什么好的做法?
4 回答
与任何插件/扩展模型一样,您应该将“合同”(插件作者应该实现的接口)放在与您的应用程序分开的程序集中。
这样,您就可以将该程序集提供给插件作者,而无需向他们提供整个应用程序 - 如果它是您需要单独许可的商业应用程序,这将非常有用。
MEF Preview 5 引入了导出接口的能力(即向接口添加 [Export] 属性),以便自动导出该接口的任何实现者。这意味着插件作者甚至不需要了解 MEF - 他们只是实现您的接口,并且它们自动成为 MEF 扩展。
实际上,.NET 4.0 中有一个称为类型等效的新功能可以实现这一点。使用此功能,您可以在不同的合同程序集中拥有两个不同的接口,告诉 CLR 它们是相同的。因为它是低级的,所以 MEF 可以很好地使用它。
一些警告:
- 除框架类型外,仅支持自定义接口。
- 不支持自定义通用接口。
- 匹配需要两个接口上的 guid :-(
您可以在此处阅读更多相关信息:http: //msdn.microsoft.com/en-us/library/dd997297 (VS.100).aspx 。文档会说它适用于 COM,但您也可以将它用于托管代码。
最初 MEF 打算实现鸭子类型,这意味着您不需要通用程序集,但显然这被证明太难了。
我将它们全部放在一个通用程序集中,以及一些可用于帮助实现接口的有用抽象基类。
我也有同样的问题,想看一个例子,其中在一个项目中定义了合同,在其他项目中定义了多个实现,以及一个单独的消费者项目,它使用合同并具有扩展文件夹,其中实现 dll 可以简单地复制并可用消费者应用程序无需任何代码更改。所以我尝试编写一个简单的 Hello World 类型的应用程序并发布在我的博客上。希望你会发现它有用。我还发布了源代码(在 C# 中)。
http://ppsinfo.blogspot.com/2009/11/managed-extensibility-framework-mef.html