数据传输对象(Data Transfer Object)和值对象(Value Object)是否相同,还是有所不同?如果它们不同,那么我们应该在哪里使用DTO,在哪里使用VO?
我们讨论的编程语言是Java,上下文是:有一个Web应用程序,从数据库中获取数据,然后对其进行处理,最终将处理后的信息显示在前端。
数据传输对象(Data Transfer Object)和值对象(Value Object)是否相同,还是有所不同?如果它们不同,那么我们应该在哪里使用DTO,在哪里使用VO?
我们讨论的编程语言是Java,上下文是:有一个Web应用程序,从数据库中获取数据,然后对其进行处理,最终将处理后的信息显示在前端。
一个值对象是一个简单的对象,它的相等性不基于标识。 数据传输对象是用于在软件应用程序子系统之间传输数据的对象,通常在业务层和UI之间传输。 它仅专注于纯数据,因此没有任何行为。
将值对象与系统中具有唯一标识的事物(称为实体)进行对比。如果您的系统跟踪客户进行付款,那么客户和付款是实体,因为它们代表特定的事物,但付款金额只是一个值,从您的系统角度来看,它本身并不存在。某个东西如何与您的系统相关决定了它是值对象还是实体。
如果您不想将实际的领域对象发送到服务客户端,则在服务边界处使用DTO可以帮助减少客户端和服务之间的依赖关系。
值对象只是其相等性不基于标识的对象,例如java.lang.Integer。
DTO和值对象并不是彼此的替代品。
太阳社区中的许多人使用“值对象”这个术语来表示此模式。但我使用它来表示其他含义。
因此,“值对象”一词已被用于表示DTO,但根据他(以及其他帖子),似乎不鼓励将其用作DTO。
在Matthias Noback的文章它是DTO还是值对象?中有一个很好的详细答案。
简而言之,这是一个DTO:
Declares and enforces a schema for data: names and types
Offers no guarantees about correctness of values
Wraps one or more values or value objects
Provides evidence of the correctness of these values