如何在控制器、服务和存储库模式中使用 DTO
2022-09-02 02:51:04
我正在遵循控制器,服务和存储库模式,我只是想知道DTO从何而来。
控制器是否应仅接收 DTO?我的理解是,你不会希望外部世界知道底层领域模型吗?
从域模型到 DTO 的转换应该发生在控制器层还是服务层?
我正在遵循控制器,服务和存储库模式,我只是想知道DTO从何而来。
控制器是否应仅接收 DTO?我的理解是,你不会希望外部世界知道底层领域模型吗?
从域模型到 DTO 的转换应该发生在控制器层还是服务层?
在今天使用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。
这取决于项目的规模和复杂性。项目越大,使每一层尽可能抽象/独立就越重要。