当前位置: 首页 > 知识库问答 >
问题:

CQR中的实体与DTO

丁理
2023-03-14

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

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

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

假设数据库返回:

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

但是,实体布局将姓氏映射为姓氏:

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

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

共有2个答案

姬奇思
2023-03-14

完全赞同@MikeSW,只需添加一个图(借用自axon框架)来解释架构。

Read模型是由查询用例驱动的,可以将其视为命令操作的输出。

贺彬
2023-03-14

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

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

 类似资料:
  • 我希望在我正在从事的一个项目中使用CQR,但是我目前正在努力寻找实现CQR查询端的最佳方法。基于我有限的理解,有一个瘦数据层(有时称为瘦读取层),用于查询数据库并返回DTO,其中包含应用程序UI层使用的查询结果。 由于这是一个Java的EE应用程序,我正在开发薄数据层,使用JPA使用EntityManager.createNamedQuery查询数据库,返回一个包含结果的实体,然后将其映射到DTO

  • 如果实体之间存在继承,那么我应该如何在DTO中表示它?例如: 我应该如何使用它们?例如,我发现:我正在做一个web项目。网页的用户想要注册。他/她填写表单,并将其发送到服务器。在服务器端,我首先创建一个DTO,因为它的字段有验证。我从DTO创建一个实体并将其持久化到数据库中。当有对实体的请求时,我将被请求的实体转换为DTO,并将其提供给客户端的用户。这是一个很好的想象,还是不是?

  • 我有一种情况,在一个DTO中有另一个DTO,我必须映射到它对应的实体。 我正在使用mapstruct,我已经有antherEntityMapper已经存在。 如何更改EntityMapper接口,以便我可以将一个另一个EntityDTO映射到另一个Entity? 谢谢

  • 本文向大家介绍promise的定义与 的具体实现?相关面试题,主要包含被问及promise的定义与 的具体实现?时的应答技巧和注意事项,需要的朋友参考一下 参考回答:   Promise对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。 f1().then(f2); 一个promise可能

  • 我想创建一个与JHipster的用户实体有多对一关系的实体。 我使用JDL-Studio创建了以下实体和与用户的关系,它使用jhipster port-jdl作为. jh文件导入到我的微服务中: 在编译我的微服务时,我得到以下错误: 轮廓java:44:错误:找不到符号私人用户;符号:类用户位置:类配置文件 轮廓映射器。java:12:错误:找不到symbol@Mapper(componentMo

  • 对于新学生和新课程的情况,它工作得很好,但是在新课程和现有学生的情况下,我会从数据库中抛出一个唯一的约束冲突。关系类似于下面。 在持久化之前,我尝试使用entitymanager查找一个学生,如果该学生存在,则使用该实例而不是新的学生实例。这也不起作用,它仍然尝试执行插入而不是更新