Domain driven design 从DDD到CQRS的存储库转换

Domain driven design 从DDD到CQRS的存储库转换,domain-driven-design,cqrs,ddd-repositories,Domain Driven Design,Cqrs,Ddd Repositories,最初,我的DDD存储库类似于以下示例: class PersonRepository { Person findByID(id) List<Entity> findAll() List<Entity> findWithRegex(String) } class PersonRepository{ 找到的人id(id) 列表findAll() 列表findWithRegex(字符串) } 在内部,GUI提供了一种服务,用于将实体对象转换为DTO对

最初,我的DDD存储库类似于以下示例:

class PersonRepository {
    Person findByID(id)
    List<Entity> findAll()
    List<Entity> findWithRegex(String)
}
class PersonRepository{
找到的人id(id)
列表findAll()
列表findWithRegex(字符串)
}
在内部,GUI提供了一种服务,用于将实体对象转换为DTO对象

现在我正试图进入CQR。看看其他例子,我的回购协议应该是这样的:

class PersonReadModel {
    Person findByID(id)
    List<DTO> findAll()
    List<Entity> findWithRegex(String)
}
类PersonReadModel{
找到的人id(id)
列表findAll()
列表findWithRegex(字符串)
}
仅使用DDD,我的repos仅返回实体和列表对象。对于CQR,由于许多读取仅用于UI,因此有许多读取操作返回直接的DTO,因此PersonReadModel看起来不像传统的DDD repo

这个假设正确吗?我是否应该让PersonReadModel仅返回列表并保留PersonRepository返回实体和列表对象?PersonReadModel是否应该是包含指向根聚合的内部存储库的链接的服务

我可以将DTO与其实体关联起来,因为它们都有一个标识字段。但是,我担心显示的数据与我的域模型中的实体版本不同。我看到的所有CQR示例都有DTO和实体,具有标识字段,但没有修订

修改是我应该关心的事情吗


我的猜测是,应用层中的GUI代码将构建一条带有DTO和修订版的消息,域层将使用该消息来确保所请求的命令是使用最新版本生成的。

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);
}

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);
}
“修订”是什么意思?修订是什么意思?