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

从域对象构建DTO的设计

范甫
2023-03-14

我有一个域对象的图形,我需要构建一个DTO来将其发送到视图。如何正确设计它?我看到两个选项,我可以把DTO构建代码放在哪里:

1)进入DTO构造函数。但是域对象必须通过getters向DTO呈现所有字段,所以它不是DDD。

public DTO(DomainObject domain) {
   /// access internal fields of different domain object.
}

2)进入域对象。访问字段不会有问题,但是当添加新视图时,域对象会增长得非常快。

public DTO1 createDTO1() {
    ...
}

public DTO2 createDTO1() {
    ...
}

// and so on...

我应该如何正确地构建DTO?

共有3个答案

周和歌
2023-03-14

域对象必须通过getters将所有字段呈现给DTO...

2) ... 域对象将快速增长。。。

正如您所见,问题在于这两个备选方案都将您的模型与DTO耦合起来,因此您需要将它们解耦:在它们之间引入一个层,负责执行映射/转换。

你可能会发现这个问题很有用。

闻人杰
2023-03-14

变体:

  1. 在DTO中具有简单类型的构造函数:public DTO(Long id,String title,int time,双重价格)
  2. 使用DTO1 createDTO1(DomainObject域)等方法分离类转换器
  3. 将属性从一个对象复制到另一个对象的框架,如Dozer:http://dozer.sourceforge.net/
井宪
2023-03-14

我认为这里有一个更大的问题。你不应该查询你的域。你的域应该关注行为,因此很可能不包含适合视图格式的数据,尤其是用于显示目的的数据。

如果您将整个对象(例如,Customer对象)发送回Edit,那么您执行的是非常注重数据的基于实体的交互。你可能想试着把更多的注意力放在基于任务的互动上。

所以,为了让数据进入你的视图,我建议使用一个简单的查询层。通常,您需要一些非规范化的数据来提高查询性能,而这些数据无论如何都不会出现在您的域中。如果确实需要DTO,则直接从数据源映射它们。如果您可以使用更通用的数据容器结构,那么这就是头奖。

 类似资料:
  • 我们正在用SpringBoot创建RESTAPI。我们的项目中有三层(存储库、服务和控制器)。 假设我有GetUser api在我的控制器返回对象。 是否返回对象,还是返回对象,并在控制器中转换为对象?哪种方法更好? 简而言之,域对象到DTO对象的转换,应该在服务层还是控制器层进行?

  • 问题内容: 可以说我有一个龙目岛注释类 我知道我可以做: 是否有一种简单的方法可以使用现有对象作为模板并更改其属性之一来创建Foo对象? 就像是: 我在lombok文档中找不到此文件。 问题答案: 您可以使用参数为实例提供方法。 从文档中: 如果使用@Builder生成生成器以生成您自己的类的实例(除非将@Builder添加到不返回您自己的类型的方法中,否则通常是这种情况),您可以使用@Build

  • 以前,我会将存储库注入到服务层。所以我的问题是--可以将存储库注入域对象,以便它们能够执行业务规则吗?

  • 对象的作用域决定哪些脚本可以使用该对象。默认情况下,当您创建对象实例时,该对象具有页作用域。同一 ASP 页中的任何脚本命令都能使用该页作用域的对象;当 ASP 页送回客户端时,该对象即被释放。对大多数对象来说,推荐的作用域是页作用域。您可以改变一个对象的作用域,使其可被其他页的脚本使用。本主题将解释如何使用页作用域的对象以及如何改变对象的作用域。 使用页作用域对象 在 ASP 页上用 Serve

  • 在我的Spring Boot项目中,我使用Hibernate,基本上我们有三种对象 在控制器层中使用的DTO对象 业务对象—业务对象是我们在整个应用程序中使用的对象 实体/域对象-用于JPA层 当我们准备好保存数据时,我们将业务对象转换为域/实体对象 当我们准备将其发送给客户机/控制器时,我们可以将实体对象转换为业务对象,然后将此业务对象转换为DTO对象。 理想情况下,我被告知将BOs更改为- 我

  • 我继承了一个用Java编写的应用程序,该应用程序使用JPA访问数据库。该应用程序使用了一种我以前从未遇到过的设计模式,并且我会真正了解为什么使用此模式的一些指导。与许多应用程序一样,我们有一个前端、中间件和后端数据库。数据库通过 DAO 访问。DAO上的每个方法都加载一个实体DTO,它只是一个POJO,除了获取器和设置器之外什么都没有,然后该实体DTO被传递到具有更改实体状态的其他方法的实体中。示