Java 如何在控制器、服务和存储库模式中使用DTO
我正在遵循控制器、服务和存储库模式,我只是想知道DTO是从哪里来的 控制器是否应仅接收DTO?我的理解是你不想让外界知道底层域模型Java 如何在控制器、服务和存储库模式中使用DTO,java,spring,spring-boot,dto,Java,Spring,Spring Boot,Dto,我正在遵循控制器、服务和存储库模式,我只是想知道DTO是从哪里来的 控制器是否应仅接收DTO?我的理解是你不想让外界知道底层域模型 从域模型到DTO的转换应该发生在控制器层还是服务层 一个简单的答案可能是:DTO(如果您需要,请参见下文)是允许您将特定信息传输到其他地方的东西。这是控制器/适配器/存储库/无论您如何称呼它的任务。适配器的任务是从外部世界(系统边界之外)获取信息,并将这些信息转换为相应的域模型,以便服务逻辑能够使用它 而且,在我看来,这也适用于存储库:存储库将数据持久化到外部系统(
从域模型到DTO的转换应该发生在控制器层还是服务层 一个简单的答案可能是:DTO(如果您需要,请参见下文)是允许您将特定信息传输到其他地方的东西。这是控制器/适配器/存储库/无论您如何称呼它的任务。适配器的任务是从外部世界(系统边界之外)获取信息,并将这些信息转换为相应的域模型,以便服务逻辑能够使用它 而且,在我看来,这也适用于存储库:存储库将数据持久化到外部系统(例如数据库或其他REST服务),并在请求时将其带回。为此,它可能需要将域模型转换为简化的DTO,以便能够持久化到目标系统中 适配器的思想是,业务逻辑不需要知道如何转换要在REST/SOAP/MySQL/中表示或通过REST/SOAP/MySQL/传输的对象。。。协议这就是适配器的任务。因此:如果需要,DTO应该留在适配器中 你真的需要DTO吗? DTO是系统内部数据的另一种抽象。你还应该考虑一下你是否真的需要它们。您可以这样做,也可以不这样做,这取决于您希望如何处理这些信息。如果您使用自己编写查询的数据库保存数据(意味着您没有使用ORM映射器),则可能根本不需要DTO,因为您可以直接从域模型提取相关信息 另一方面,如果您对对象使用反序列化程序(如Jackson for JSON或类似的东西),您可能会发现自己需要DTO,因为这些工具有时需要一些特殊要求,以便能够将数据序列化和反序列化为对象。在这里,您可能需要先使用DTO,然后才能将其转换为域对象,反之亦然
顺便说一句:这个问题回答得也很好正确的方法应该是控制器->服务->实现->存储库
存储库层可以返回底层模型,当实现层接收到该模型时,可以将其转换为DTO。不同的组织遵循不同的模式。这取决于你遵循的模式。根据我个人的经验,我遵循下面的架构图
根据上图,DTO到实体的对话以及DTO到实体的对话将仅在服务层内。在今天使用Spring MVC和交互式UI编程时,web应用程序实际上有4层:
- UI层(Web浏览器、JavaScript)
- MVC控制器,即用
@Controller
- 服务层,即用
@Service
- 数据访问层,即用
@Repository
这取决于项目的规模和复杂性。项目越大,使每一层尽可能抽象/独立就越重要。太好了,它来自哪里?