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

从域对象转换到DTO应使用哪一层

茅炯
2023-03-14

我们正在用SpringBoot创建RESTAPI。我们的项目中有三层(存储库、服务和控制器)。

假设我有GetUser api在我的控制器返回UserDTO对象。

@GetMapping
public UserDTO getUser() {
   return userService.getUser();    
}

是否userService。getUser()返回UserDTO对象,还是返回User对象,并在控制器中转换为UserDTO对象?哪种方法更好?

简而言之,域对象到DTO对象的转换,应该在服务层还是控制器层进行?

共有3个答案

冯卜鹰
2023-03-14

根据我的经验,转换应该在控制器层。这提供了一个优点,即能够与返回对象一起重用其他服务方法。

这一点有时可能很重要,因为DTO对象通常会减少来自原始对象的字段。因此,我们需要更多的代码来获得这些减少的字段,使我们的代码变得丑陋和重复。

我知道这会将逻辑转移到控制器层,但这是一种折衷。

刘承运
2023-03-14

它取决于应用程序需求和体系结构。这个想法是保持dto转换在边缘。通常更喜欢在控制器级别进行dto和域转换。如果您想让服务/业务逻辑独立于使用者,那么最好在api级别上使用。如果您的服务已被多个消费者使用,则这一点会更加清楚。

徐英锐
2023-03-14

我认为没有“更好的方法”可以将域对象转换为DTO对象,这只是品味的问题。在我的项目中,作为“业务逻辑”的一部分,我将域对象转换为服务层中的DTO。因此,您降低了域对象仅对服务层的可访问性。此外,我希望减少控制器内部的“逻辑”,因为它们是应用层的一部分。

PS:如果你正在寻找几种方法来转换你的域对象到你的DTO看看我最新的Stackoverflow问题之一(如何正确地转换域实体到DTO,同时考虑可扩展性

 类似资料:
  • 我目前正在开发一个restful API。NET Web API,并有一个域模型(使用实体框架)和一个DTO模型发送给客户端。 显然,API中的域模型和DTO模型之间存在一些映射。 API中我的一个控制器是Employee控制器,您可以对其执行所有CRUD操作。我创建了一个EmployeeDto对象用于控制器-例如,它可能如下所示: 我的控制器可能有以下动作方法: 我的难题是,是否适合为控制器中的

  • 我有一个域对象的图形,我需要构建一个DTO来将其发送到视图。如何正确设计它?我看到两个选项,我可以把DTO构建代码放在哪里: 1)进入DTO构造函数。但是域对象必须通过getters向DTO呈现所有字段,所以它不是DDD。 2)进入域对象。访问字段不会有问题,但是当添加新视图时,域对象会增长得非常快。 我应该如何正确地构建DTO?

  • 首先,我是SpringWebFlux的新手,正在尝试建立一个反应式spring启动项目的POC。我有一个用例,需要将检索到的实体类(PartyDTO)转换为Mono对象(Person:这是一个没有构造函数的第三方业务对象,我无法修改它)。我在谷歌上搜索,但找不到与我的用例相匹配的答案。 第三方对象: 我的课程如下: 调用我的存储库的服务类。 如上图所示,我尝试将平面图与我的自定义映射器一起使用,但

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

  • MVC中DTO转换应该在哪里进行? 我正在使用JPA。从控制器接收DTO作为参数。 此时,是否需要在控制器中转换它并将其传递给服务? 或者,我想知道服务是否接收DTO并转换它。

  • 当我试图使用ModelMapper将嵌套的java对象转换为嵌套的DTO时,我遇到了一个问题。在父DTO对象中,子DTO为null。以下是代码片段。 实体类: DTO的课程: 这是映射器代码: 输出: 输出用户DTO:UserDTO[名称=xyz,地址=null,产品=null] 在这里,我想将用户实体转换为UserDTO-dto。我得到了地址和产品DTO的空值。我在这里到底缺少什么?有人知道吗?