如何构建可插拔软件?


20

如果您拥有某种应用程序,并且希望您的用户能够为其编写插件,那么该应用程序应如何设计?

您必须考虑什么,对此有哪些设计模式?


我想到了观察者,中介者,命令广告责任链之类的模式
Mchl 2011年

3
@Mchl:请发表您的答案作为答案,而不是作为评论。
S.Lott

您应该看看MefMSDN信息
Luc Bos

我觉得不详细使其能有这样的
MCHL

@Mchl:“不够详细”?那为什么要发表评论呢?显然,这是一个答案。请张贴答案作为答案。
S.Lott

Answers:


13

有点取决于您的平台,但请记住一些常规事项

版本控制 如果更新应用程序会发生什么,所有旧插件会过时吗(firefox问题)

隔离 插件可以做什么吗?你一直信任他们吗?还是您需要在某种沙箱中运行它们并请求权限。

更新 您如何处理插件更新?

安全性 如何确保插件的作者,防止欺骗或欺骗用户安装恶意代码。通常通过某种代码签名来解决

序列化 通常,当您使用某种隔离时,需要在不同线程或进程之间序列化信息。您如何最有效地做到这一点?

可扩展性 您需要扩展哪些方面?如何在不使API变得笨拙的情况下最大程度地发挥插件的潜力。

如果您要针对第三方开发人员使用插件,那么(根据我的经验)我想说的最重要的一点是,将插件api和类与应用程序的其余部分完全区分开,并使其易于开发尽可能。从主应用程序进行架构到将其“渗入”插件非常容易,因此插件作者必须学习的知识远远超过了他们所需要的。让他们感到轻松,考虑一下您作为插件作者想要什么样的界面和体验。

另一个不错的心态不是像“插件将完成所有这些事情(以代码形式)而是以“插件需要提供此信息”那样思考。”这样,应用程序可以使用必要的信息并进行实际处理,从而简化插件。

同样,通常,只要您能采用描述性方法(元数据,例如xml)而不是代码,就具有很大的优势,因为元数据更易于传输,版本化,部署,安全并且可以更轻松地由第三方配置


1
+1它并不能直接回答问题,但是您需要牢记这些重要问题
Adriano Carneiro

我相信这些问题的人开始开发实际的可扩展性机制之前被覆盖
格斯

9

我写了此代码项目文章,内容涉及在.NET中使用MEF进行扩展。这是一个很好的介绍。

.NET还有其他可扩展性框架,例如SharpDevelop的加载项体系结构Mono.AddinsSystem.AddIn

对于Java,有Eclipse插件体系结构

一般模式是这样的:

  • 您在主机和扩展之间定义一个合同(通常是一个接口)
  • 您需要一种发现机制,该机制会消失并寻找已安装的扩展
  • 您需要能够动态加载扩展并使主机知道它们

实际上,它与依赖注入和策略模式有很多共同点。


+1 MEF和System.AddIn都是不错的选择。即使您最终没有使用它们,它们都显示出很好的概念。
RationalGeek

@jkohlhepp-我同意,我也建议您深入研究SharpDevelop架构,因为有很多关于它的文章,它是开源的(MEF,btw也是如此),并且它的设计很好。
Scott Whitlock

3

您只需要为插件提供一个接口即可。

它至少应包含一个Activate-Methode(入口点),但是您还需要Initialize等东西。

并且应该有可能以类似注册表的方式与主机应用程序进行通信,例如注册菜单项。因此,应提供可更改/可扩展的插件注册表。

另外,主机应用程序的数据和对象应该有一些可访问的存储,以便插件可以调用其例程。通过使用像Unity这样的DI容器并允许插件访问它,可以轻松完成此操作,以便他们可以解析所需的服务。

Event-Aggregator可能也是一个好主意,因此插件可以引发事件并以分离的方式对来自其他插件和主机应用程序的事件做出反应。你一定要一个!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.