☰
ruflo-ddd 聚合根脚手架实战:用 ddd-aggregate 技能在 bounded context 中生成 Entity、Value Object、Repository 与领域事件
2026/10/11 8:57:04 网站建设 项目流程

ruflo-ddd 聚合根脚手架实战:用 ddd-aggregate 技能在 bounded context 中生成 Entity、Value Object、Repository 与领域事件

【免费下载链接】ruflo🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo

聚合根(Aggregate Root)是 Domain-Driven Design(DDD)中维护业务不变量的一致性边界。ruflo 仓库内置的ruflo-ddd插件提供了ddd-aggregate技能,一条命令即可在一个已存在的 bounded context 中生成聚合根实体、值对象、仓库接口、领域事件与单元测试桩,并把领域模型持久化到 AgentDB 图存储中供后续会话导航。读完本文,你将掌握/ddd-aggregate <context> <aggregate-name>的完整调用流程、每一层产物的结构与约束、配套的ddd-context/ddd-validate校验体系,以及如何用 smoke 脚本验证整个插件的契约完整性。

一、ddd-aggregate 技能是什么

ddd-aggregate是ruflo-ddd插件提供的三个技能之一(另两个是ddd-context与ddd-validate),定义在 plugins/ruflo-ddd/skills/ddd-aggregate/SKILL.md。它的定位是:

Scaffold a complete aggregate root inside a bounded context.

技能 frontmatter 中的argument-hint为"<context> <aggregate-name>",调用方需传入两个 kebab-case 参数:<context-name>(已存在的 bounded context 名)与<aggregate-name>(要新建的聚合根名)。例如向ordering上下文中添加order聚合:

/ddd-aggregate ordering order

该技能会一次性生成"实体 + 仓库 + 事件 + 测试桩"四件套,并把聚合节点写入 AgentDB 分层图,这正是 ADR-0001 中定义的插件契约的一部分(见 plugins/ruflo-ddd/docs/adrs/0001-ddd-contract.md)。

触发时机

按 SKILL.md 的description定义,以下场景适合调用它:

  • 向一个已有 bounded context添加新聚合;
  • 建模一个拥有自身不变量(invariants)的新业务概念;
  • 生成 entity + repo + events 三件套样板代码。

二、前置条件:bounded context 必须已存在

ddd-aggregate的第 1 步就是校验前置条件:确认src/<context>/domain/目录存在。如果不存在,技能会建议先运行/ddd-context <context>创建 bounded context——也就是说,ddd-aggregate假定你已经在src/下建立了上下文结构。

上下文的标准目录结构由 plugins/ruflo-ddd/skills/ddd-context/SKILL.md 定义:

src/<context-name>/ domain/ entities/ # Entities and aggregate root value-objects/ # Immutable value objects events/ # Domain events services/ # Domain services repositories/ # Repository interfaces application/ # Use cases / application services infrastructure/ # Repository implementations, ACL adapters index.ts # Public API of the context

ddd-context技能还要求为entities、value-objects、events、services、repositories各生成一个index.tsbarrel 导出文件,并在domain/index.ts中汇总再导出,最后在src/<context-name>/index.ts中只 re-export domain 与 application,不导出 infrastructure——这是保护领域层不被基础设施污染的关键纪律。创建完成后,上下文会以context:<context-name>节点写入 AgentDB 分层图。

三、ddd-aggregate 完整执行流程(10 步拆解)

以下是 ddd-aggregate/SKILL.md 的完整步骤,结合仓库源码逐层展开。

第 1 步:校验上下文存在

确认src/<context>/domain/已存在,否则提示先运行/ddd-context <context>。

第 2 步:Pre-task hook

执行:

npx @claude-flow/cli@latest hooks pre-task --description "DDD aggregate: <aggregate-name> in <context>"

该 hook 会记录任务开始,配合第 10 步的 post-task hook 形成闭环,供后续神经训练与任务追踪使用。

第 3 步:创建聚合根实体(Aggregate Root Entity)

文件路径:src/<context>/domain/entities/<aggregate-name>.entity.ts

必须包含四要素:

  1. 唯一 ID 字段(unique ID field);
  2. 构造函数内做不变量校验(constructor with invariant validation);
  3. 执行业务规则的领域方法(domain methods that enforce business rules);
  4. 基于身份(identity)的equals()。

同时要求导出一个实现或继承基础AggregateRoot接口的 TypeScript 类。这意味着聚合根内部的状态变更必须经由其领域方法,而非外部直接 set——ddd-validate技能会专门扫描"绕过校验的公开 setter"来核查这一点(详见第四节)。

第 4 步:创建值对象(Value Objects)

文件路径:src/<context>/domain/value-objects/<aggregate-name>-id.value-object.ts

要求是不可变(immutable)的 ID 值对象,带工厂方法与校验。技能还会建议为聚合根的其他属性补充更多值对象。参照 plugins/ruflo-ddd/REFERENCE.md 中的定义,值对象是"没有身份、按值相等、无副作用"的描述性对象——例如金额、地址、订单号都适合建模为值对象。

第 5 步:创建仓库接口(Repository Interface)

文件路径:src/<context>/domain/repositories/<aggregate-name>.repository.ts

必须包含findById、save、delete三个方法,并以聚合根与 ID 值对象作为类型参数。这是纯接口,不提供实现——实现属于基础设施层(infrastructure)的关注点,会被放置在infrastructure/目录。这也是 DDD 的经典依赖倒置:领域层定义持久化契约,基础设施层负责兑现。

第 6 步:创建领域事件(Domain Events)

生成两个事件文件:

  • src/<context>/domain/events/<aggregate-name>-created.event.ts
  • src/<context>/domain/events/<aggregate-name>-updated.event.ts

每个事件需包含:事件名(过去时态,past tense)、时间戳、聚合 ID、payload。REFERENCE.md的命名约定进一步给出示例:OrderPlaced、InvoiceVoided、CustomerEmailChanged这类 PascalCase 过去时命名。领域事件是"已经发生的事情的记录",因此必须不可变,且ddd-validate会专门检查事件是否携带聚合 ID。

第 7 步:创建单元测试桩(Unit Test Stubs)

文件路径:src/<context>/domain/entities/<aggregate-name>.entity.test.ts

覆盖三类用例:

  • 构造不变量(construction invariants);
  • 领域方法行为(domain methods);
  • 相等性(equality)。

测试命名采用describe/it+should [behavior] when [condition]的句式,例如should reject negative quantity when constructing Order。

第 8 步:更新 barrel 导出

将新文件加入对应目录的index.tsbarrel 文件中(entities、value-objects、repositories、events 各自的 index.ts),与ddd-context生成的 barrel 结构保持一致。

第 9 步:持久化到领域模型图

将聚合写入 AgentDB 分层图与任务记忆:

mcp__plugin_ruflo-core_ruflo__agentdb_hierarchical-store --parent "context:<context>" --child "aggregate:<aggregate-name>" --relation "contains" mcp__plugin_ruflo-core_ruflo__memory_store --key "ddd-aggregate-<context>-<aggregate-name>" --value "AGGREGATE_SUMMARY" --namespace tasks

这样aggregate:<aggregate-name>节点就以contains关系挂在context:<context>节点之下。REFERENCE.md中给出了更完整的图存储配方——上下文依赖可以用因果边(causal edge)表达:

mcp__plugin_ruflo-core_ruflo__agentdb_hierarchical-store --parent "context:ordering" \ --child "aggregate:order" --relation "contains" mcp__plugin_ruflo-core_ruflo__agentdb_causal-edge --from "context:ordering" \ --to "context:inventory" --type "depends-on" mcp__plugin_ruflo-core_ruflo__agentdb_causal-edge --from "context:ordering" \ --to "context:payments" --type "publishes-events-to"

REFERENCE.md建议项目级标准化的边类型包括:depends-on(同步耦合)、publishes-events-to(即发即忘的事件流)、translates-via-acl-to(防腐层翻译)、conforms-to(下游原样采用上游模型)。

第 10 步:Post-task hook

npx @claude-flow/cli@latest hooks post-task --task-id "ddd-aggregate-<aggregate-name>" --success true --train-neural true

开启--train-neural true会把本次成功模式沉淀到神经学习中,使后续聚合建模继承既有模式。

四、配套校验:ddd-validate 如何守住聚合纪律

聚合根脚手架生成后,边界与不变量需要持续被审计。ddd-validate技能(plugins/ruflo-ddd/skills/ddd-validate/SKILL.md)提供四类检查,正好回扣ddd-aggregate产物的约束:

类别检查内容对应聚合产物约束
BOUNDARY扫描src/*/domain/下所有.ts的 import,发现直接深入其他上下文domain/目录的导入即标记违规;只允许通过对方公开index.ts(application 层)导入聚合根不应被跨上下文直接 import
INVARIANT扫描聚合根实体的公开 setter 是否绕过校验、可变公开属性是否无校验、子实体是否被直接暴露(必须经聚合根访问)聚合根是唯一变更入口
EVENT事件是否过去时命名、是否不可变(无公开 setter)、是否携带聚合 ID事件命名与不可变约束
REPOSITORY仓库接口必须在domain/repositories/(而非infrastructure/);实现必须在infrastructure/(而非domain/);每个聚合根恰有一个仓库接口与实现分层、一对一阵列

ddd-validate还会输出违规表(文件路径、行号、违规类型、建议),按类别与严重度汇总,并将结果写入任务记忆:

npx @claude-flow/cli@latest memory store --key "ddd-validation-TIMESTAMP" --value "RESULTS_SUMMARY" --namespace tasks npx @claude-flow/cli@latest hooks post-task --task-id "ddd-validate" --success true --store-results true

它可当作 CI gate 使用,在合并跨切变更前拦截边界侵蚀。

五、通过 /ddd 命令驱动技能

ddd-aggregate技能由/ddd命令(plugins/ruflo-ddd/commands/ddd.md)路由,命令共 6 个子命令:

子命令行为
ddd context create <name>调用/ddd-context技能搭建 bounded context
ddd context list扫描src/*/domain/列出全部上下文(find src -maxdepth 2 -name "domain" -type d)
ddd aggregate <context> <name>调用/ddd-aggregate技能生成聚合根四件套
ddd event <context> <name>生成单个领域事件类(过去时命名 + 时间戳 + payload 接口 + 静态工厂方法),并注册到事件 index
ddd validate调用/ddd-validate技能检查边界违规
ddd map扫描所有上下文、分析 import 依赖,输出上下文关系图(upstream/downstream、ACL、shared kernel、published language,以及直接 import 导致的边界违规)

六、领域建模者 Agent 与命名规范

ruflo-ddd提供domain-modeleragent(plugins/ruflo-ddd/agents/domain-modeler.md,model 为 sonnet),其职责包括:识别子域与通用语言、设计带不变量的聚合根、定义领域事件与命令、生成防腐层接口。它的工作流与ddd-aggregate技能互补:先在内存中检索既有领域模型(memory search --query "bounded context DOMAIN"),再执行脚手架,最后沉淀模式(memory store --key "ddd-pattern-CONTEXT")。

命名规范以 REFERENCE.md 为准:

  • 聚合根:PascalCase 单数名词(Order、Customer、Invoice);
  • 领域事件:PascalCase 过去时(OrderPlaced、InvoiceVoided);
  • 命令:PascalCase 祈使(PlaceOrder、VoidInvoice);
  • 仓库接口:<Aggregate>Repository(OrderRepository);
  • 领域服务:<Verb><Noun>Service(PriceQuoteService)。

七、安装与契约验证

安装插件:

claude --plugin-dir plugins/ruflo-ddd

CLI 固定在@claude-flow/cliv3.6 major+minor(见 plugins/ruflo-ddd/README.md)。插件声明ddd-patternsAgentDB 命名空间(kebab-case,遵循 plugins/ruflo-agentdb/docs/adrs/0001-agentdb-optimization.md 的命名空间约定),并约定不得遮蔽保留命名空间(pattern、claude-memories、default)。

契约以 smoke 脚本为准(smoke-as-contract,见 plugins/ruflo-ddd/scripts/smoke.sh 与 ADR-0001):

bash plugins/ruflo-ddd/scripts/smoke.sh # 期望输出: "10 passed, 0 failed"

10 项结构化检查包括:插件版本与关键词(acl、value-objects、repositories、mcp);3 个技能存在且 frontmatter 含name/description/allowed-tools;agent 与 command 文件齐全;/ddd覆盖 6 个子命令;REFERENCE.md非空;README 固定 v3.6 与命名空间协调;ADR-0001 状态为 Accepted;且技能中禁止通配符工具授权(allowed-tools: *)。

八、总结

ddd-aggregate技能把"新增一个聚合根"这一高频 DDD 建模操作标准化为一条可复现的命令流程:从实体(含不变量与equals())、不可变值对象、纯接口仓库、过去时领域事件到测试桩,每一步都有明确文件路径与约束;配合 AgentDB 图存储,领域模型成为可被后续会话与 pathfinder 导航的活图。再叠加ddd-context(上下文骨架)、ddd-validate(边界与不变量审计)、/ddd map(上下文关系可视化)与 smoke 契约测试,ruflo 在插件层面形成了一套完整的 DDD 脚手架闭环——这也是在 plugins/ruflo-ddd/README.md 中定义的核心价值:把业务领域转化为结构良好的 bounded context,并以可导航的图模型沉淀每一次建模决策。

【免费下载链接】ruflo🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询