我不是在寻找特定于语言的答案,只是用于实现插件系统的通用模型(如果你想知道,我正在使用 Python)。我有自己的想法(注册回调,仅此而已),但我知道其他人存在。什么是通常使用的,还有什么是合理的?
插件系统是什么意思?依赖注入和 IOC 容器听起来像是一个好的解决方案吗?
我的意思是,嗯,是一种在不改变基础程序的情况下将功能插入到基础程序中的方法。出发的时候,我并没有打算定义它。依赖注入看起来并不特别适合我正在做的事情,但我对它们了解不多。
我不是在寻找特定于语言的答案,只是用于实现插件系统的通用模型(如果你想知道,我正在使用 Python)。我有自己的想法(注册回调,仅此而已),但我知道其他人存在。什么是通常使用的,还有什么是合理的?
插件系统是什么意思?依赖注入和 IOC 容器听起来像是一个好的解决方案吗?
我的意思是,嗯,是一种在不改变基础程序的情况下将功能插入到基础程序中的方法。出发的时候,我并没有打算定义它。依赖注入看起来并不特别适合我正在做的事情,但我对它们了解不多。
一个简单的插件架构可以定义一个插件接口,其中包含插件应该实现的所有方法。该插件处理来自应用程序的事件,并且可以使用应用程序的标准代码、模型对象等来完成工作。基本上与 ASP.NET 表单相同,只是您是重写而不是实现。
没有人教我这部分,我也不是专家,但我觉得:一般来说插件会不如它的应用程序稳定,所以应用程序应该始终处于控制之中,只给插件周期性的行动机会。如果插件可以注册观察者,则应尝试/捕获对委托的调用。
在 Python 中,您可以使用setuptools
和提供的入口点系统pkg_resources
。每个入口点应该是一个返回插件信息的函数——名称、作者、设置和拆卸函数等。
为了将来参考,我在此处复制了Erich Gamma, Kent Beck在出色的对 Eclipse 的贡献中给出的“启动器规则”(替代链接)。
- 邀请规则 - 只要有可能,让其他人为您的贡献做出贡献。
- 延迟加载规则 - 贡献仅在需要时加载。
- 安全平台规则 - 作为扩展点的提供者,您必须保护自己免受扩展者的不当行为。
- 公平竞争规则 - 所有客户都遵守相同的规则,包括我在内。
- 显式扩展规则 - 显式声明可以扩展平台的位置。
- 分集规则 - 扩展点接受多个扩展。
- 良好的围栏规则 - 在代码之外传递控制权时,请保护自己。
- 显式 API 规则 - 将 API 与内部分离。
- 稳定规则 - 一旦你邀请某人贡献,不要改变规则。
- 防御性 API 规则 - 仅显示您有信心的 API,但准备好在客户要求时显示更多 API。
抽象工厂怎么样?您的基础程序定义了抽象概念如何相互交互,但调用者必须提供实现。