最初我的 DDD 存储库看起来像这个例子:
class PersonRepository {
Person findByID(id)
List<Entity> findAll()
List<Entity> findWithRegex(String)
}
内部服务提供将实体对象转换为 DTO 对象的 GUI
现在我正在尝试进入 CQRS。在查看其他示例后,我的仓库似乎应该是这样的:
class PersonReadModel {
Person findByID(id)
List<DTO> findAll()
List<Entity> findWithRegex(String)
}
仅使用 DDD,我的存储库仅返回 Entity 和 List 对象。对于 CQRS,由于许多读取仅用于 UI,因此有许多读取操作会返回直接 DTO,因此 PersonReadModel 看起来不像传统的 DDD 存储库。
这个假设正确吗?我应该让PersonReadModel只返回 List 并保留PersonRepository返回 Entity 和 List 对象吗?PersonReadModel应该是包含指向根聚合的内部存储库的链接的服务吗?
我可以将 DTO 与其实体相关联,因为它们都有一个身份字段。但是,我担心显示的 DTO 与我的域模型中存在的实体的版本不同。我见过的所有 CQRS 示例都有 DTO 和带有标识字段的实体,但没有修订。
修订是我应该关注的吗?
我的猜测是应用层中的 GUI 代码将构建一条带有 DTO 和修订版的消息,并且域层将使用它来确保所请求的命令是使用最新版本构建的。