存储库从DDD到CQRS的转换

时间:2013-10-25 12:28:01

标签: domain-driven-design cqrs ddd-repositories

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

1 个答案:

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