如果 Service returns DTO 不是实体,如何在 Spring Boot 的其他服务中处理 DTO?

If Service returns DTO not entity, how to handle DTO in other service in Spring Boot?

阅读这篇article后,我将return服务方法实体的值更改为DTO。

但在下面的情况下我有点困惑。

Entity A <- Repository A <- Service A

Entity B <- Repository B <- Service B

然后,如果服务 B 需要访问实体 A,那么调用服务 A 中的方法。由于该方法的结果是 DTO,而不是实体,我很难处理服务 B 中的 DTO A。

我应该在 Service B 中调用 repository A 吗?或者我应该在 Service B 中调用 Service A 并使用 modelmapper 将 dto 转换为服务 B 中的实体?


// Controller code
@RestController 
public FooDTO getSomeFoo(){    
    return new FooDTO(service.getFoo()) 
}  


// Service code
@Service 
public Foo getFoo(){     
    return repository.find(~) 
}

在我看来,除非你真的想保护你的实体在相应服务以外的其他地方被更改,否则我会在服务层内的调用中避免 DTO。这意味着可以 return 您知道的方法中的实体被您的应用程序中的其他服务调用,除非您真的很想对您的应用程序进行过度设计。 话虽如此,您应该 return DTO 仅在您的控制器层调用的方法中使用,以便它们在您的 REST API 中使用(假设您有一个)。 当然,这需要遵守纪律并确保您不在控制器上调用本应仅由服务调用的方法。有一种架构试图解决这个问题(如果您想阅读更多相关信息 --> https://medium.com/@shivendraodean/software-architecture-the-onion-architecture-1b235bec1dec),您可以尝试利用包保护功能来保证这一点。

Should I call repository A in Service B?

绝对不是。你永远不应该(永远不会是一个强硬的词,但你至少应该努力避免它)这样做,否则你的代码将变得一团糟,没有任何结构。