5

在一个普通的 DDD 项目中,我希望从存储库中检索到的实体作为 DTO 从域层发送到应用层。

似乎 CQRS 存在的一个原因是应用层所需的查询(主要是读取操作)与领域层所需的查询不同。所以看起来即使是同一对象的查询结果也可能在层之间有所不同。

在我的域层中,我已经将查询结果映射到域实体中。我对一些 CQRS 示例将查询结果直接映射到跳过其匹配实体的 DTO 感到困惑。

假设数据库返回:

{"person": {
  "id:": 5323423,
  "name": "John",
  "family_name": "Smith"
  ...
}}

然而,实体布局将姓氏映射为姓氏

class Person
{
   Identity id;
   String name;
   String surname;
}

如果在我见过的一些 CQRS 示例中发生这种情况,则提取的 DTO 看起来会有所不同,从而在将实体与其 DTO 匹配时导致冲突。这些冲突是如何解决的?在我看来,任何 DTO(与实体相关)都应始终从其实体生成。但是,在这种情况下,在应用层中执行不同类型查询的自由度就会丢失。

4

2 回答 2

6

关键是您不会将实体映射到 DTO。DTO 由特定上下文需要的内容定义,并成为查询/读取模型。当实体更新时,事件处理程序也将使用它来更新读取模型。

所以基本上读取模型是从所有需要的实体(1个或更多)生成和更新的,通常以增量方式。

于 2013-10-27T16:37:33.003 回答
6

完全同意@MikeSW,只需添加一个图表(从 axon-framework 借来的)来解释架构。

在此处输入图像描述

readmodel 由查询用例驱动,您可以将其视为命令操作的输出。

于 2013-10-28T01:07:25.343 回答