转移对象和领域对象的区别

60

您能简单解释一下传输对象和域对象的区别吗?如果您能举一个Java示例,那就太好了。

4个回答

75
  • 数据传输对象(DTO)没有任何逻辑,它们只有字段(状态)。在从一层/子系统传输数据到另一层/子系统时使用它们。
  • 域对象可以具有逻辑(取决于您是否使用领域驱动设计或贫血数据模型),通常与数据库结构相关。

如果使用贫血数据模型(即您的域对象没有任何逻辑),DTO和域对象可以是同一个对象。

相关链接: http://techblog.bozho.net/?p=427


9
领域对象与持久化没有特定的关系。简单来说,它们是确保应用程序运行所需的业务逻辑部分。在大多数情况下,您可以并且应该在不考虑持久性的情况下创建应用程序。例如,在开始时使用内存对象和虚假仓库进行工作。 - Steve Rakebrandt

36

数据传输对象(DTO)用于在应用程序的不同部分(如不同层或不同应用程序)之间交换数据。

  • DTO只是一个“愚笨”的数据结构。
  • 它们用于契约/接口定义 - 这意味着使用这些接口的任何组件都“知道”这些对象。

领域对象(DO)(以及它们派生自的类)实现业务逻辑,因此它们仅位于业务逻辑层/领域中(即使术语不同,本质含义相同)。

由于DO实现了业务逻辑,因此它们可能会非常复杂,并且可以包括方法、事件等。

关于DTO的另一个要点

根据Martin Fowler的观点,DTO是几个对象的组合(大多数人通常将每个对象称为DTO);理由是,在某些情况下,将更大的数据包较少地发送(而不是“喋喋不休”地跨越网络发送许多小数据包)会更经济。所以对于大多数人来说,DTO是如我在答案开头定义的那样(或类似于此)。

总之,DTO是用于不同组件或应用程序之间交换数据的愚笨数据结构。而DO则实现了业务逻辑,因此可能更加复杂。


谢谢您的回复。这是否意味着DTO主要用于表示层,而DO仅用于后端? - copenndthagen
不,DTO并不局限于演示层。 - Adrian K
1
+1 DTO通常用于跨层使用,但不仅限于此。 - OCB

5

由于传输对象的使用性质,它们通常是可序列化的。如果调用是远程的并且在 JVM 之间进行,或者它们将以促进序列化的方式使用,例如有状态会话 bean,则这尤为重要。出于这个目的,传输对象必须易受到这种“处理”的影响,即传输对象实现可序列化。

相反地,领域对象可能包含行为,但 DTO 仅是一种传输媒介。


-1

从业务角度来看,领域对象是活动的参与者或主体,具有整个领域和流程,DTO是数据对象,不同于数据bean,它忠实地反映数据库对象(特别是在ORM架构中)。 DTO可以具有数据聚合、转换、组合等功能,以满足表示或某些数据操作需求,它没有主题,但领域对象根据其领域级别定义具有主题。


2
这是否为以上答案增加了任何价值? - Chad Van De Hey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接