Cordis 抛弃了传统依赖注入框架中侵入性强的装饰器,转而采用声明式依赖,插件通过一个 inject 字段声明自身所需的服务。
插件声明 inject: ['llm', 'tools'] 后,Cordis 会等待这两个服务全部就绪才执行插件的启动逻辑,无需手写轮询或启动顺序编排。加载顺序完全由依赖图决定,与代码的书写顺序无关——开发者可以随意调整 ctx.plugin() 的调用次序,插件何时真正启动只取决于它的依赖是否到位。
依赖的监听不是一次性的。运行过程中如果某个被依赖的服务被卸载,依赖它的插件的 Fiber 会自动进入卸载状态并清理资源;当依赖重新出现时(例如热重载),插件又会自动回到挂起状态并重新加载。这保证了依赖始终指向当前正在生效的实现,而不是插件启动瞬间捕获的旧对象引用。
当某个服务的底层实现被替换时,Cordis 只会重载真正声明依赖该服务的插件,依赖未发生变化的插件纹丝不动。在拥有成百上千个独立作者插件的开放生态中,这套声明式规则是它们之间唯一的协调机制,却能让依赖变化被精确地局部化。