领域驱动设计:Task与Template/Workflow的聚合根选型咨询
针对Task与Template/Workflow的DDD聚合设计方案
1. 双聚合根的核心设定
将Task和Template均设为独立聚合根,各自承担明确职责:
- Task聚合根:专注于单个任务的生命周期管理,包括创建、修改、删除任务定义(如名称、执行逻辑、参数约束等),确保任务自身的业务规则(如名称唯一性、参数合法性)在聚合内部得到保障。
- Template聚合根:负责Workflow的编排逻辑,核心是维护一组Task的引用关系及执行规则,不直接持有Task实体,仅通过
TaskId(值对象)关联已存在的Task。
2. 用值对象明确关联关系
在Template聚合根内部,通过TaskReference值对象固化关联细节,该值对象包含:
taskId:关联目标Task的唯一标识sequence:Task在Workflow中的执行顺序dependency:可选的前置Task ID,用于处理串行/分支依赖逻辑
这种设计让Template与Task的关联关系清晰可追溯,同时避免了跨聚合持有实体导致的一致性问题。
3. 领域服务处理跨聚合校验
新增TemplateDomainService,负责在Template创建/修改阶段完成跨聚合的规则校验:
- 校验引用的
TaskId对应的Task是否存在且处于可用状态 - 校验Workflow的执行顺序无循环依赖
- 确保Template中引用的Task符合业务场景要求(如特定类型的Task才能被加入某类Template)
4. 持久化层的配合设计
- 数据库分三张表:
tasks存储Task的完整数据,templates存储Template的基础信息,template_task_refs存储Template与Task的关联关系及编排参数(顺序、依赖等)。 - 查询Template时,通过关联表加载对应Task的元数据,无需加载完整的Task聚合实例,兼顾性能与数据一致性。
设计逻辑总结
遵循DDD聚合根的边界原则:聚合根仅维护自身内部的一致性,跨聚合关联通过ID引用实现。Task与Template的职责完全分离,既保证了Task可以独立定义、复用,又让Template的编排关系清晰明确,同时通过领域服务解决跨聚合的规则校验问题。
内容的提问来源于stack exchange,提问作者Subra M
相关产品推荐
相关产品推荐

