最初我的DDD存储库看起来像这个例子:
class PersonRepository {
Person findByID(id)
List<Entity> findAll()
List<Entity> findWithRegex(String)
}
在服务内部,GUI提供了将实体对象转换为DTO对象的GUI
现在我正试图进入CQRS。在查看其他示例后,我的回购似乎应该是这样的:
class PersonReadModel {
Person findByID(id)
List<DTO> findAll()
List<Entity> findWithRegex(String)
}
只有DDD我的repos只返回了Entity和List对象。使用CQRS,因为许多读取仅用于UI,有许多读取操作返回直接DTO,因此PersonReadModel看起来不像传统的DDD存储库。
这个假设是对的吗?我应该 PersonReadModel 只返回List并保留 PersonRepository 返回Entity和List对象吗? PersonReadModel 应该是包含指向根聚合的内部存储库的链接的服务吗?
我可以将DTO与其实体相关联,因为它们都具有标识字段。但是我担心显示的DTO与我的域模型中存在的实体不同的版本。我见过的所有CQRS示例都有DTO和实体带有标识字段,但没有版本。
我应该关注修订版吗?
我的猜测是,应用层中的GUI代码将使用DTO和版本构建一条消息,并且域层将用于确保所请求的命令是使用最新版本构建的版本
答案 0 :(得分:1)
ReadModel位于查询端。您不必以DDD方式构建此部件,而是以易于查询的方式构建它。一旦进入项目,我甚至使用公共领域阅读模型,因为他们只是数据持有者。
@Entity
@Table(name="t_order_detail")
public class OrderDetailReadModel {
@Id
public String tracking_id;
public String booking_contact_name;
//other fields
}
public class OrderDetailReadModelQueryObject {
OrderDetailReadModel findBy(String id);
List<OrderDetailReadModel> findByReg(string regex);
}
在命令端,简化了聚合存储库,大多数情况下只需要findById()和store():
class PersonRepository {
Person findByID(id)
void store(Person person);
}