组合根(Composition Root) 产品与架构
别名:
装配点
把 core 各模块组装成产品的唯一入口:读配置、建 Provider、建工具注册表、注入 `callLlm` 与 `tools`。界面层是唯一的组合根。见[第 14 章](/chapters/14-product-v01-cli/)。
它是什么
组合根(Composition Root)是把 core 各模块组装成产品的唯一入口:读配置、建 Provider、建工具注册表、注入 callLlm 与 tools。界面层(cli.mjs)是唯一的组合根——组装发生在「用户代码首次执行」的地方,而不是散落在各模块里互相 new。
为什么必须唯一
组合根必须「尽量靠近应用入口」且全应用唯一,原因与依赖注入的纪律一致:组装是产品特有的、非业务逻辑,它定义了「这个应用由哪些零件以什么顺序组成」。如果每个模块都自己拼装依赖,依赖关系就散了、测试也没法替换注入(换 mock 只能靠改源码)。「组合根」概念出自 Mark Seemann 的《Dependency Injection in .NET》:一个组合根是应用特有的,它定义了单个应用的组成。
在本教程的位置
第 14 章的 cli.mjs 只做三件事:读输入、调 core(loadConfig → createChatProvider → createBaseTools → runAgent)、打印输出。ch15 服务化时 server.mjs 成为新的组合根,core 依旧不认识任何界面。