需求分析与建模61 条

仓储(Repository)

仓储为聚合提供持久化的领域视角:按聚合根存取、隐藏存储细节,让领域层不依赖具体数据库与 ORM。

职责按标识获取、保存、删除聚合根
边界一个聚合根对应一个仓储;不返回裸数据集
实现通常由基础设施层实现接口,领域层只依赖抽象

仓储与 DAO 的分工

维度仓储DAO
抽象层次领域聚合的集合语义表或记录的 CRUD 操作
返回对象聚合根等完整领域对象行记录或持久化实体
查询职责按聚合标识存取,复杂查询外移常承载各类查询方法
  • 接口只放聚合根级别的存取方法,避免堆砌查询条件
  • 实现放基础设施层,领域层仅依赖接口
  • 复杂读取走独立读模型或查询服务
  • 每次事务只变更一个聚合,由工作单元统一提交
  • 测试可用内存实现替换数据库,保持领域测试轻快
  • 命名用领域语言(如 findByOrderNo),避免 getTableData 式技术命名
标识策略聚合标识在应用侧生成(如 UUID),不依赖数据库自增,便于测试与迁移
加载方式按标识整聚合加载;需要部分数据时先检查聚合边界是否被拆错
测试建议领域测试配内存仓储,真实映射与 SQL 交给集成测试验证
复杂报表与多表联查需求不要硬塞进仓储,用独立的查询服务或读模型更清晰。

易错点

  • 仓储接口里堆满查询条件方法,退化成 SQL 包装器
  • 领域对象直接暴露 ORM 实体,持久化细节渗入模型

数据来源与参考

  • Eric Evans《Domain-Driven Design》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌