如何在控制器、服务和存储库模式中使用 DTO

2022-09-02 02:51:04

我正在遵循控制器,服务和存储库模式,我只是想知道DTO从何而来。

控制器是否应仅接收 DTO?我的理解是,你不会希望外部世界知道底层领域模型吗?

从域模型到 DTO 的转换应该发生在控制器层还是服务层?


答案 1

在今天使用Spring MVC和交互式UI进行编程时,Web应用程序实际上有4层:

  • UI层(Web Browser,JavaScript)

  • MVC 控制器,即标注有@Controller

  • 服务层,即标注有@Service

  • 数据访问层,即标注有@Repository

每当其中一个层与底层交互时,它们都需要发送/接收数据(通常是POJO)以在层之间传输数据。这些 POJO 是 DTO,也称为数据传输对象。

层之间只应使用 DTO,并且它们不一定相同,例如,服务层可能会将业务逻辑应用于从数据访问层接收的 DTO,因此服务层 API 的 DTO 不同于数据访问层 API。类似地,控制器可以重新排列数据以准备其呈现(分组,摘要等),因此发送到Web浏览器的数据与从服务层接收的数据不同。

通过完全抽象,数据访问层的API不应该反映数据访问的技术,即它是否使用JDBC,JPA,NoSQL,Web服务或其他一些存储/检索数据的方法。这意味着实体类不应位于数据访问层之外。

大多数项目不需要该级别的抽象,因此 DTO 通常为实体类,并从数据访问层一直流向控制器,在控制器中,它由视图使用,或者发送到 Web 浏览器,编码为 JSON。

这取决于项目的规模和复杂性。项目越大,使每一层尽可能抽象/独立就越重要。


答案 2

不同的组织遵循不同的模式。这取决于您遵循的模式。根据我个人的经验,我遵循下面的架构图。

enter image description here

根据上图,DTO 到实体对话(反之亦然)将仅在服务层内部。


推荐