---
name: ddd-design
when: '领域驱动设计, DDD, 领域模型, 聚合根, 值对象, 领域事件, 充血模型, 贫血模型, 模块设计'
scope:
  - backend
products:
  - '*'
id: ka-pattern-ddd-design
asset_kind: pattern
lifecycle_status: active
owner_mechanism_id: mc-backend-pattern
authority: supporting
routes:
  - '*'
primary_triggers:
  - 领域驱动设计
  - DDD
  - 领域模型
  - 聚合根
  - 值对象
  - 领域事件
  - 充血模型
  - 贫血模型
  - 模块设计
priority: P2
specificity: 3
version: 1.1.0
last_reviewed: '2026-06-01'
consumes: []
emits: []
secondary_triggers: []
negative_triggers: []
type: pattern
stages: ["架构设计"]
---

## 决策规则
- 简单 CRUD 使用贫血模型，禁止在领域不复杂时强行使用充血模型
- 不教条式应用 DDD，仅在领域真正复杂时采用充血领域模型
- 一个模块/类应该只有一个变更原因（SRP），两个方法被不同需求修改即为 SRP 违反
- 跨模块非强一致性流程应优先事件驱动架构，未采用事件驱动必须文档化原因
- 高层模块必须依赖抽象而非具体实现（DIP），Service 依赖 Repository 接口而非具体 DAO
- 写操作涉及金额、库存、状态流转等关键逻辑应考虑封装在领域服务中
- 聚合根必须有明确的边界，聚合间通过 ID 引用而非对象嵌套
- 领域事件必须由聚合根产生，跨聚合操作通过事件最终一致性
- 值对象必须不可变（immutable），使用新的值对象表示变更
- 仓储（Repository）只对聚合根提供存取，聚合内部实体不独立持久化
- 领域服务只在跨聚合或需要外部资源时使用，单一聚合逻辑放在聚合根内

## 验收项
- [AC-01] CRUD 场景使用贫血模型
- [AC-02] 跨模块交互有明确的依赖方向
- [AC-03] Service 依赖接口而非具体实现
- [AC-04] 事件驱动决策有文档记录
- [AC-05] 聚合边界清晰，聚合间 ID 引用
- [AC-06] 值对象不可变
- [AC-07] 仓储仅对聚合根
