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

Which layer should be used for conversion to DTO from Domain Object

我们正在使用 Spring Boot 创建其余的 api。我们的项目中有三层(存储库、服务和控制器)。

假设我的控制器中有 GetUser api return UserDTO 对象。

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

无论是userService.getUser()returnsUserDTO对象还是returnsUser对象并且在UserDTO对象中转换为UserDTO对象控制器?哪种方法更好?

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

我认为没有 "better way" 可以将域对象转换为 DTO 对象,这是个人喜好问题。在我的项目中,我将域对象转换为服务层中的 DTO 作为我 "business logic" 的一部分。因此,您仅将域对象的可访问性降低到您的服务层。此外,我想减少控制器内部的 "logic",因为它们是应用程序层的一部分。

PS:如果您正在寻找将域对象转换为 DTO 的几种方法,请查看我最新的 Whosebug 问题之一 ()

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

以我的经验,转换应该在Controller层。这提供了一个优势,即能够以 return 对象为起点重用其他服务方法。

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

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