MEF是全有或全无的事吗?

时间:2010-04-20 14:32:10

标签: c# wpf inversion-of-control mef

我最近有一些关于MEF的问题,但这里有一个很大的问题 - 它看起来真的是全有或全无吗?

我的基本应用程序结构只是一个应用程序,几个旨在成为单例的共享库,以及几个不同的插件(可能实现不同的接口)。该应用程序加载插件,应用程序和所有插件都需要访问共享库。

我第一次去MEF是相当成功的,虽然我在路上犯了一些愚蠢的错误,因为我尝试了很多不同的事情,我有时会感到困惑。但最后,昨晚我用MEF,一些共享库和一个插件运行了我的小测试应用程序。

现在我正在转移目标应用程序,我已经描述过了。这是多个插件部分,有点担心。

我现有的应用程序已经通过使用Reflection支持多个具有不同接口的插件。我需要能够唯一地标识每个插件,以便用户可以选择一个并获得该插件公开的预期行为。问题是我不知道该怎么做......但这是另一个问题的主题。

理想情况下,我可以使用现有的插件加载器并按原样使用它,同时依靠MEF来执行共享库解析。问题是,我似乎无法让MEF加载它们(即我在调用ComposeParts()时得到一个CompositionException),除非我也使用MEF来加载插件。如果我这样做,那么......那么我需要知道如何在加载时跟踪它们,以便用户可以从插件列表中选择一个。

您尝试混合搭配这些方法有什么经验?

1 个答案:

答案 0 :(得分:4)

MEF旨在让您轻松加载插件程序集。如果您可以控制插件(我的意思是您可以添加MEF导出属性),那么就不需要保留自己的使用反射的插件加载器。 MEF为您做到了这一切。

话虽如此,“混合和匹配”MEF与其他技术肯定是可能的。听起来你的问题是,如果你使用自己的插件加载器,你不会将这些插件添加到MEF容器中。因此,对于尝试导入所选插件的部件,您会获得CompositionException

要将使用您自己的代码加载的插件添加到MEF容器,您可以像这样使用ComposeExportedValue

container.ComposeExportedValue<IPlugin>(selectedPlugin);

编辑:我现在通过“全有或全无”看到你的意思。您的问题是,为了能够使用MEF导入零件,您还需要使用MEF构造对象。然后,此问题级联到通常创建该对象的对象,等等到应用程序根目录。

为了避免这种“全有或全无”效果,您可以通过将MEF容器暴露为全局变量(即静态字段)来妥协。这样,类可以访问MEF容器并从中拉出导出,例如通过在构造函数中调用Program.Container.GetExportedValue<MyDependency>()

edit2 :如果您的对象不是由MEF构建的,那么有两种方法可以将它添加到容器中。

首先是致电container.ComposeExportedValue<IMyContractType>(myObject);

第二种是在属性getter中返回对象,然后使用[Export(typeof(SomeType))]属性标记属性本身。