我不太关注语言特定的答案,只是实现插件系统的一般模型(如果你想知道,我正在使用Python)。我有自己的想法(注册回调,这就是它),但我知道其他人存在。什么是正常使用的,还有什么是合理的?
插件系统是什么意思?依赖注入和IOC容器听起来是一个很好的解决方案吗?
我的意思是,嗯,这是一种在不改变功能的情况下将功能插入基本程序的方法。我出发时并不打算定义它。依赖注入不会看起来特别适合我正在做的事情,但我对它们知之甚少。
答案 0 :(得分:2)
一个简单的插件架构可以定义一个插件接口,其中包含插件应该实现的所有方法。该插件处理来自应用程序的事件,并可以使用应用程序的标准代码,模型对象等来完成任务。基本上与ASP.NET表单相同,除了你要覆盖而不是实现。
没有人教我这一部分,我不是专家,但我觉得:一般来说,插件不如其应用程序稳定,因此应用程序应始终处于控制状态,并且只为插件定期提供行动机会。如果一个插件可以注册一个Observer,那么应该尝试/捕获对该委托的调用。
答案 1 :(得分:1)
在Python中,您可以使用setuptools
和pkg_resources
提供的入口点系统。每个入口点应该是一个函数,它返回有关插件的信息 - 名称,作者,设置和拆卸功能等。
答案 2 :(得分:1)
您可能感兴趣的episode Software Engineering Radio非常好。
为了将来的参考,我在这里转载了由{2}由Erich Gamma,Kent Beck提供的优秀Rules for Enablers中的“alternative link”(Contributing to Eclipse)。
- 邀请规则 - 尽可能让其他人为您的贡献做出贡献。
- 延迟加载规则 - 仅在需要时加载贡献。
- 安全平台规则 - 作为扩展点的提供者,您必须保护自己免受扩展程序的不当行为的影响。
- 公平竞赛规则 - 所有客户都遵守相同的规则,即使是我。
- 显式扩展规则 - 明确声明可以扩展平台的位置。
- 多样性规则 - 扩展点接受多个扩展。
- 良好的围栏规则 - 在您的代码之外传递控制权时,请保护自己。
- 显式API规则 - 将API与内部分开。
- 稳定性规则 - 一旦您邀请某人做出贡献,就不要改变规则。
- 防御性API规则 - 仅显示您自信的API,但准备在客户要求时显示更多API。
答案 3 :(得分:0)
abstract factory怎么样?您的基础程序定义了抽象概念如何相互交互,但调用者必须提供实现。