13

数据传输对象与值对象相同还是不同?如果它们不同,那么我们应该在哪里使用 DTO,我们应该在哪里使用 VO?

我们谈论的编程语言是Java,上下文是-有一个Web应用程序,它从数据库中获取数据然后对其进行处理,最终将处理后的信息显示在前端。

4

5 回答 5

11

值对象是一个简单的对象,其相等性不基于身份。数据传输对象是用于在软件应用子系统之间(通常在业务层和 UI 之间)传输数据的对象。它只关注普通数据,所以它没有任何行为。

于 2012-01-12T14:53:01.770 回答
4

数据传输对象是将一堆数据从一层或一层移动到另一层的工具,其目标是通过将一堆东西打包到同一个数据结构中并将它们一起发送来最小化来回调用的数量。有些人也使用它,就像迈克尔在他的帖子中指出的那样,这样一层使用的类就不会暴露给调用它的层。当我将 DTO 称为杂物时,我的意思是没有一个精确的抽象概念得到实现,它是一种帮助应用层之间通信的实用解决方法。

值对象是我们只对其值感兴趣的东西,例如货币金额、日期范围或查找表中的代码。它没有身份,这意味着如果你有几个,你就不会担心跟踪哪个是哪个,因为它们本身不是事物。

将值对象与在您的系统中确实具有唯一标识的事物(称为实体)进行对比。如果您有一个跟踪客户付款的系统,那么客户和付款都是实体,因为它们代表特定的事物,但是付款上的货币金额只是一个值,它本身并不存在,就您的系统而言。某事物与您的系统的关系决定了它是值对象还是实体。

于 2012-02-15T13:40:03.720 回答
3

如果您不想将实际的域对象发送到服务的客户端,请在服务的边界使用 DTO - 这有助于减少客户端和服务之间的依赖关系。

values 对象只是其相等性不基于身份的对象,例如 java.lang.Integer

DTO 和值对象并不是真正的替代品。

于 2012-01-12T15:36:38.973 回答
0

它们是不同的,但我过去什至可以互换使用这两者,这是错误的。我读到 DTO(数据传输对象)在核心 J2EE 模式书的第一版中被称为 VO(值对象),但找不到该参考。

DTO,我有时将其称为 Dumb Transfer Object 以帮助我记住它是一个容器,不应该有任何业务逻辑用于在层和层之间传输数据。它应该是一个具有 getter/setter 属性的对象。

然而,VO 类似于 JAVA Enum 并表示一组固定的数据。VO 没有对象标识(对象实例在内存中的地址),它由其值标识并且是不可变的。

于 2018-08-07T22:08:20.753 回答
0

Martin Fowler,谈论数据传输对象 (DTO)

Sun 社区中的许多人为这种模式使用术语“值对象”。我用它来表示别的东西。

因此,“值对象”一词已被用来表示 DTO,但就他(和其他海报)而言,似乎不鼓励将其用作 DTO。

于 2021-08-31T10:53:00.883 回答