命令对象和 DTO,区别?

Posted

技术标签:

【中文标题】命令对象和 DTO,区别?【英文标题】:Command objects and DTOs, difference? 【发布时间】:2017-03-11 12:11:35 【问题描述】:

当我们谈到 Grails 甚至 Spring 中的命令对象时,它们是否与数据传输对象相同?意思是,命令对象是 DTO 企业设计模式实现的一个例子吗?如果不是,有什么区别?

【问题讨论】:

【参考方案1】:

数据传输对象 (DTO) 是在任何两个层或进程之间传输数据的对象(简单的 java bean)。您通常可以引入/使用 DTO 层并使用从外部 Web 服务或外部系统接收到的数据填充 DTO bean。更多详情请参考Martin Fowler's blog on Data Transfer Object

Command object只是一个spring (mvc) 术语,它将html表单数据映射到一个java bean(form bean)。这里 Spring Dispatcher servlet & helper 类将数据从 html 表单映射到 java bean。在 Grails 中,命令对象确实提供的不仅仅是 AST 转换等数据载体。

总之,它们都是从一层到另一层的数据载体。

Spring 中的命令对象是 DTO 企业设计模式实现的一个例子吗?

是的,但需要注意的是 Spring Dispatcher servlet & 辅助类使用 html 表单数据填充命令对象。

【讨论】:

“Command 对象只是一个 spring (mvc) 术语,它将 html 表单数据映射到一个 java bean (form bean)”——这在 Grails 的上下文中是不正确的,这就是问题所在是关于。我们为 Grails 所谓的“命令对象”做了很多特殊的事情,不仅包括数据绑定,还包括依赖注入和验证。 "...但要注意的是 Spring Dispatcher servlet & helper 类使用 html 表单数据填充命令对象。" - 这在 Grails 中是不正确的。我们有一个 AST 转换,可以在编译时装配所有数据绑定、依赖注入和验证逻辑。调度程序 servlet 不参与 Grails 中的任何操作。 我明白你对 Grails 的看法,但这个问题结合了 Spring 和 Grails 这就是为什么我说“在 Grails 的上下文中这不是真的” 在用 Java(和 Spring Boot)编写的 RESTful API 上使用 DTO 的另一个优点是,它们可以帮助隐藏域对象(又名实体)的实现细节。

以上是关于命令对象和 DTO,区别?的主要内容,如果未能解决你的问题,请参考以下文章

Java中 PO VO BO DTO DAO 和 POJO 的概念及区别(图解)

什么是 DTO 和 BO?有什么区别?

pojo与DTO的区别是啥?

SpringBoot中VO,DTO,DO,PO的概念、区别和用处

POJO,JAVABEAN,Entity,domain,DTO,ejb区别

POJO, DTO, VO, JavaBean的区别