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

Sul*_*kan 10 layer dto spring-restcontroller

我们正在使用Spring Boot创建rest api。我们的项目分为三层(存储库,服务和控制器)。

可以说我的控制器中有GetUser api,它返回UserDTO对象。

@GetMapping
public UserDTO getUser() {
   return userService.getUser();    
}
Run Code Online (Sandbox Code Playgroud)

userService.getUser()返回UserDTO对象还是返回User对象并将其转换为UserDTO控制器中的对象?哪个更好的方法?

不久,域对象到DTO对象的转换应该在服务层还是控制器层进行?

rie*_*pil 8

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

PS:如果您正在寻找几种将域对象转换为 DTO 的方法,请查看我最新的 Stackoverflow 问题之一(如何在考虑可扩展性和可测试性的同时将域实体正确转换为 DTO

  • 如果服务层返回实体,我想我们还有另一个关于事务的问题。如果服务返回的实体有一些惰性集合,我们应该在控制器中打开事务来访问数据,对吗?可以从控制器打开交易吗? (2认同)

Imr*_*ved 6

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


小智 6

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

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

我知道这会将逻辑转移到控制器层,但这是一个权衡。