DDD实践:如何按状态查询多个聚合根 同库CQRS下场景聚合查询方案选择
结论
直接在Scene对应的领域层Repository中扩展查询方法获取完整聚合根即可,不要用读侧的Query Repository,也没必要自己手动查库后拼聚合。
具体原因
- 你拉取
Scene的目的是执行业务逻辑,属于CQRS的写侧操作,必须拿到符合业务不变量规则的完整聚合根实例,读侧Query Repository返回的一般是扁平化的读模型DTO,没有业务方法也不会做聚合规则校验,完全不适合用来做写操作。 - 领域Repository的核心职责就是封装聚合根的查询、持久化逻辑,你只需要在
SceneRepository中新增对应方法即可,上层业务不需要关心聚合的构建细节,避免你手动拼聚合时漏字段、违反业务规则的问题。 - 你当前是读写同库的CQRS架构,不存在读写分离带来的数据延迟问题,通过领域Repository查询到的就是最新的聚合状态,可以直接用来执行业务逻辑。
实现示例
你可以直接在Scene的领域Repository中定义查询方法:
public interface SceneRepository extends Repository<Scene, SceneId> { List<Scene> findAllActive(); }
如果你的项目用了JPA、MyBatis等ORM框架,Repository的实现层可以直接把数据库查询结果自动映射为Scene聚合实例,只有当聚合构建逻辑非常复杂的时候才需要额外调用工厂来创建聚合,普通场景不需要多这一步。
内容的提问来源于stack exchange,提问作者qingyuan
相关产品推荐
相关产品推荐

