Skip to content

核心概念

本页讲清 0.2 的三个基础模型:作用域树、生命周期、依赖声明。其余手册页会引用这里的结论,不再重复解释。

作用域树

作用域(Scope)是资源的归属单元。框架启动时创建一棵作用域树:根作用域持有核心服务,每个插件在安装(主体执行)时获得一个从根作用域派生的子作用域。

text
rootScope(核心服务、插件 share 提升的服务)
 ├── 插件 A 的子作用域(A 自己的登记)
 └── 插件 B 的子作用域(B 自己的登记)

作用域的规则只有三条:

  • 父链读取get / has / list 先查本作用域,未命中沿父链向上逐层委托。因此插件可以读到根作用域的全部服务,但读不到兄弟插件的登记。
  • 登记归属set / register / provide 登记的资源归属调用时所在的作用域。子作用域的登记不污染父作用域;要对全框架提供服务,用 share 提升到根作用域(见 编写服务)。
  • 显式销毁dispose() 是唯一的销毁入口,可等待且幂等。销毁顺序先子后父——父作用域销毁时,所有子作用域先按创建逆序销毁。

插件拿到的 Context 是绑定到其子作用域的使用者视图:读取与登记都委托给该子作用域,作用域的创建与销毁由框架控制。

生命周期

每个作用域持有独立的生命周期(Lifecycle),状态机为:

text
PENDING → STARTING → ACTIVE → STOPPING → STOPPED
                        失败时进入 → FAILED
STOPPED / FAILED 可再次 start(enable/disable 开关的底座)
dispose() 进入终态 DISPOSED,拒绝一切后续操作

四个钩子阶段:

  • onStart:随启动按注册顺序执行;钩子持久保留,STOPPED 后再次启动会重新触发;
  • onBeforeStop:停止时最先执行(用于停止前的通知);
  • onStop:清理钩子,按注册逆序执行,同样持久保留;
  • onDispose:终态钩子,仅 dispose() 时执行一次。

关键语义:所有清理都是可等待的。插件的禁用、卸载,框架的停止,都会等待钩子完成;单个钩子失败不阻断其余清理,失败最终汇总抛出。

依赖声明

插件通过 inject 声明依赖,按名字解析:

  • 名字命中作用域中登记的服务:作为服务依赖。实例沿父链经 context.get() 读取。
  • 名字命中已安装的插件:作为插件依赖。仅约束启动顺序(被依赖方先启动、后停止),不注入实例。
  • 都不命中:视为缺失依赖,插件进入"等待依赖"状态——install 挂起主体、enable 标记期望启用,依赖补齐后自动迁移。

框架按依赖拓扑排序启动插件,停止时按拓扑逆序;依赖消失时级联停止、恢复时级联重启。细节见 依赖与诊断

从 Container 到 Scope

0.1 的 Container 在 0.2 已完全移除,作用域是唯一的资源管理入口。0.1 代码的迁移方法见 0.1 → 0.2 迁移指南

Saukko.js 系列项目均使用 Apache 2.0 协议开源。