CQRS中的实体与DTO

时间:2013-10-27 16:27:05

标签: design-patterns entity domain-driven-design dto cqrs

在一个普通的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(与实体相关)都应该始终从其实体生成。但是,在这种情况下,在应用层中执行不同类型查询的自由会丢失。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

与@MikeSW完全一致,只需添加一个图表(借用axon-framework)来解释架构。

enter image description here

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