1

最初我的 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 和修订版的消息,并且域层将使用它来确保所请求的命令是使用最新版本构建的。

4

1 回答 1

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);
}
于 2013-10-25T12:50:19.983 回答