我的开发工作中的重复主题是使用或创建内部插件体系结构。我已经看到它接近了许多方法 - 配置文件(xml,.conf等),继承框架,数据库信息,库等。在我的经验中:

  • 数据库并不是存储您的配置信息的好地方,尤其是与数据共密集的地方
  • 尝试使用继承层次结构进行此操作,需要对要编码的插件进行了解,这意味着插件体系结构并不是所有动态的
  • 配置文件可以很好地提供简单的信息,但无法处理更复杂的行为
  • 图书馆似乎运行良好,但是必须仔细创建单向依赖性。

当我寻求从与我合作的各种架构中学习时,我也向社区寻求建议。您如何实现坚实的插件体系结构?您最严重的失败(或您见过的最严重的失败)是什么?如果要实现新的插件体系结构,该怎么办?您与之合作的哪个SDK或开源项目具有良好的体系结构的最佳示例?

我一直在自己发现的一些例子:

这些例子似乎发挥了各种语言优势。一个好的插件体系结构一定与该语言绑定了吗?最好使用工具来创建插件体系结构,或者自行执行以下模型?

有帮助吗?

解决方案

这不是一个 回答 大量有用的备注/示例。

  • 使您的应用程序可扩展的一种有效方法是将其内部用语视为脚本语言,并用该语言写所有顶级内容。这使其使其可修改,并且实际上是将来的证明(如果您的原语是正确选择和实施的)。这种事情的成功故事是Emacs。我更喜欢Eclipse样式插件系统,因为如果我想扩展功能,我不必学习API并编写/编译单独的插件。我可以在当前缓冲区本身中编写3行摘要,对其进行评估并使用。非常平稳的学习曲线和非常令人愉悦的结果。

  • 我扩展了一点的一个应用程序是 trac. 。它具有一个组件体系结构,在这种情况下,这意味着任务被委派给了广告扩展点的模块。然后,您可以实现其他适合这些点并更改流量的组件。有点像卡尔基的建议。

  • 另一个很好的是 py.test. 。它遵循“最好的API不是API”哲学,并且纯粹依赖于每个层面都被调用的钩子。您可以将这些挂钩覆盖在根据公约命名的文件/功能中,并改变行为。您可以在网站上查看插件列表,以查看可以快速/可以轻松实现它们的速度。

一些一般要点。

  • 尝试使您的不可扩展性/非用户模型的核心尽可能小。将您可以的所有内容委派给更高的层,以使可扩展性增加。在选择不良的情况下,要纠正核心的内容少。
  • 与上述点有关的是,您不应该在一开始就项目方向做出太多决定。实现最小所需的子集,然后开始编写插件。
  • 如果您嵌入了脚本语言,请确保它是一个完整的语言,您可以编写一般程序而不是玩具语言 只是 用于您的申请。
  • 尽可能减少样板。不要打扰子类,复杂的API,插件注册以及类似的内容。尝试保持简单,以便 简单的 不只是 可能的 扩展。这将使您的插件API更多地使用,并鼓励最终用户编写插件。不仅是插件开发人员。 py.test做得很好。据我所知,日食 才不是.

其他提示

根据我的经验,我发现实际上有两种类型的插件架构。

  1. 一个人遵循 Eclipse model 这是为了允许自由和开放式。
  2. 另一个通常需要插件遵循 narrow API 因为插件将填充特定功能。

以不同的方式陈述这一点 允许插件访问您的应用程序 而另一个 允许您的应用程序访问插件.

区别是微妙的,有时没有差异……您都希望两者都用于应用程序。

我在Eclipse/将您的应用程序开放到插件模型方面没有很多经验(Kalkie帖子中的文章很棒)。我在Eclipse做事的方式上读了一些,但仅此而已。

是的 属性博客 谈论了属性模式的使用如何允许插件和可扩展性。

我所做的大多数工作都使用了插件架构来允许我的应用访问插件,例如时间/显示/地图数据等。

几年前,我将创建工厂,插件管理器和配置文件来管理所有这些文件,让我确定在运行时使用哪个插件。

  • 现在我通常只有一个 DI framework 做大部分工作。

我仍然必须编写适配器来使用第三方库,但是它们通常还不错。

我看到的最好的插件体系结构之一是在Eclipse中实现。与其使用插件模型的应用程序,不如说是插件。基本应用程序本身是插件框架。

http://www.eclipse.org/articles/article-plug-in-architecture/plugin_architecture.html

我曾经从事一个必须在每个客户可以设置系统的方式上如此灵活的项目,我们发现的唯一好设计是将客户运送到C#编译器!

如果规格充满了以下单词:

  • 灵活的
  • 插入
  • 可定制

询问许多有关您将如何支持该系统的问题(以及如何为支持支付,因为每个客户都会认为他们的情况是正常情况,不需要任何插件。),如我的经验

客户的支持(或Fount-Line支持人员)编写插件比架构要困难得多

我将描述过去使用的一种相当简单的技术。该方法使用C#反射来帮助插件加载过程。可以修改此技术,因此适用于C ++,但您将失去能够使用反射的便利。

一个 IPlugin 接口用于识别实现插件的类。将方法添加到接口中,以允许应用程序与插件通信。例如 Init 该应用程序将使用该插件初始化的方法。

要查找插件,应用程序扫描了.NET组件的插件文件夹。每个组件都被加载。反思用于扫描实施的类 IPlugin. 。创建每个插件类的实例。

(或者,XML文件可能会列出要加载的组件和类。这可能有助于性能,但我从未发现性能问题)。

Init 每个插件对象都调用方法。它传递给实现应用程序接口的对象的引用: IApplication (或其他指定为您应用的名称的内容,例如Itexteditorapplication)。

IApplication 包含允许插件与应用程序通信的方法。例如,如果您正在编写文本编辑器,则该界面将有一个 OpenDocuments 允许插件列举当前打开文档的集合的属性。

该插件系统可以通过创建派生的插件类,例如LUA扩展到脚本语言 LuaPlugin 那是向前的 IPlugin 功能和应用程序接口到LUA脚本。

此技术使您可以迭代地实施您的 IPlugin, IApplication 以及开发过程中其他特定于应用的界面。当应用程序完成并进行了很好的重构后,您可以记录裸露的接口,并且应该拥有一个不错的系统,用户可以为其编写自己的插件。

我通常使用MEF。托管的可扩展性框架(或简称MEF)简化了可扩展应用程序的创建。 MEF提供发现和组成功能,您可以利用这些功能来加载应用程序扩展。

如果您有兴趣阅读 更多的...

我认为您需要首先回答以下问题:“预计哪些组件将是插件?”您想将此数字保持在绝对最小值或必须测试爆炸的组合数量。尝试将核心产品(应该没有太多灵活性)与插件功能分开。

我发现IOC(控制倒置)主(读取弹簧式工程)非常适合提供灵活的基础,您可以为其添加专业化以使插件开发变得更简单。

  • 您可以扫描容器中的“接口为插件类型广告”机制。
  • 您可以使用容器来注入插件可能需要的常见依赖关系(IE Resoursceloaderaware或MessagsOrceaware)。

根据我的经验,创建灵活插件体系结构的两种最佳方法是脚本语言和库。这两个概念在我心中正交。两者可以以任何比例的比例混合,就像功能性和面向对象的编程一样,但是在平衡时找到最大的优势。图书馆通常负责实现特定的 界面 具有动态功能,而脚本倾向于强调 功能 具有动态接口。

我发现一个基于 管理库的脚本 似乎做得最好。脚本语言允许对低级库进行高级操纵,因此库摆脱了任何特定的界面,将所有应用程序级交互留在脚本系统的更灵活的手中。

为此,脚本系统必须具有相当强大的API,并具有应用程序数据,逻辑和GUI的挂钩,以及从库中导入和执行代码的基本功能。此外,通常需要脚本 安全的 从某种意义上说,应用程序可以优雅地从编写不良的脚本中恢复。使用脚本系统作为间接层,这意味着应用程序可以更轻松地在Bad™的情况下分离自身。

包装插件的手段在很大程度上取决于个人喜好,但是使用简单界面的压缩存档您永远不会出错,例如 PluginName.ext 在根目录中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top