2010-06-24 97 views
8

(我知道其他MEF/MAF问题,但这是一个更具体的问题)可扩展WPF应用程序 - MEF,MAF还是简单加载?

我想创建一个WPF应用程序,将基本上只是一个简单的附加在主机上,图形用户界面和设置。所有的实际工作将由一个或多个插件完成。他们不需要互相沟通,主应用程序会发送用户输入/命令给他们,他们会返回一些结果(例如,WPF UI元素来呈现)。

现在,由于应用程序的核心将基于插件,因此我需要选择一种管理它们的好方法。我希望能够在运行时加载/卸载/重新加载它们(例如,当找到并下载更新时)。他们可能应该在自己的应用领域和/或过程中运行,以确保稳定性和安全性。

从一些研究和实验我来到了三个选项:

  • System.Addin(MAF):看来,这所能做的一切,我需要。有一个流水线允许同时运行多个版本的API以实现兼容性等。但除非我错过了一些我需要多次创建API的地方 - 主机和插件视图,合同和合同的两个适配器。此外,与MEF相比,信息和资源很少,大多数文章都是几年前的文章。我担心这会慢慢死去,宁愿不要将它用于新项目。

  • MEF:这一个看起来更简单,但它也觉得有很多魔法我无法控制,并且层没有像MAF那样分开。我只想要一个小型库,您可以链接到一个新项目,实现该接口并完成插件。

  • 手动加载:的最后一个选项将是为的.dll手动扫描文件夹,使用反射来寻找插件类和创建实例。虽然它是可行的,我宁愿用一些框架比手动加载组件,创建单独的进程/应用程序域等

那么,哪一个将是最适合这种应用,或者是有什么说我”错过了?

+0

真正整洁的主题。夫妇好相关的文章; http://pwlodek.blogspot.com/2011/07/isolating-mef-components.html和http://blogs.msdn.com/b/tilovell/archive/2011/08/19/wf4-hosting-the- workflowdesigner - 或其它-WPF的东西-IN-A-单独-应用程序域。aspx – Will 2011-12-02 21:46:10

回答

9

MEF绝对是三者中最简单的选择。它确实是在设计时考虑到了这种确切的场景(可扩展应用程序)。

它实际上是Visual Studio使用的“插件”机制,这是一个WPF应用程序。所有你需要做的就是让你的“插件”实现一个接口或从已知的基类派生,并添加[Export]属性。只要它的程序集被添加到主应用程序的目录中,该类型可以由主应用程序在一个步骤中编辑[Import]。这项工作涉及很少的工作。

这将是我的建议,除非有很强的理由去用不同的选项。 MAF具有更多的隔离支持,但使用起来更加困难,并且大多数隔离功能在WPF应用程序中不可用,因为在任何情况下,WPF中的UI都无法真正被隔离。

+0

“...因为WPF中的用户界面不能真正被隔离......”不确定你的意思。我需要应用程序返回一些用户界面,例如一个按钮。这将由主应用程序呈现,但它可以回调到插件。是否有可能使插件运行在不同的appdomain中,以防止它崩溃整个应用程序,并可能为低信任插件提供一些隔离? – lacop 2010-06-24 16:34:57

+0

@Iacop:我会为此使用MEF。你不能真正隔离单独的AppDomain中的用户界面,因为它需要你的shell可用(这就是我的意思)。如果你这样做是为了扩展UI,那么由MAF提供的AppDomain隔离是不可用的,因为一个UI始终存在于单一主AppDomain(在WPF中),并且不能跨AppDomain。 – 2010-06-24 18:35:20

+1

如果您使用MAF进行纯算法插件(没有UI代码),可以将插件分离到单独的AppDomain中 - 但使用UI可扩展性,这样做并不奏效 - 因此您失去了MAF的单一优势 - 这就是为什么我要说MEF(它更灵活,支持更好,更易于使用等)。 – 2010-06-24 18:36:18