什么是数据传输对象?

什么是数据传输对象?

在MVC中是模型类DTO,如果不是有什么区别,我们是否需要两者?

数据传输对象是用于封装数据的对象,并将其从应用程序的一个子系统发送到另一个子系统。

DTO是N层应用程序中最常用的服务层,用于在自身和UI层之间传输数据。 这样做的主要好处是它减less了分布式应用程序中需要通过线路发送的数据量。 他们也在MVC模式中做出了很好的模型。

DTO的另一个用途是封装方法调用的参数。 如果一个方法需要超过4或5个参数,这可能是有用的。

当使用DTO模式时,您也可以使用DTO组装器。 汇编程序用于从域对象创buildDTO,反之亦然。

从域对象到DTO的转换再回来可能是一个昂贵的过程。 如果你没有创build一个分布式应用程序,你可能不会看到这个模式带来的好处,正如Martin Fowler在这里解释的那样

DTO的定义可以在Martin Fowler的网站上find。 DTO用于将parameter passing给方法和返回types。 很多人在用户界面中使用这些元素,但是其他人却从它们中扩大了域对象。

一个DTO是一个愚蠢的对象 – 它只是拥有属性,并有getter和setter,但没有其他任何意义的逻辑(除了可能比较()或等于()实现)。

通常,MVC中的模型类(在此假设.net MVC)是DTO或DTO的集合/集合

一般来说, 值对象应该是不可变的。 像Java中的IntegerString对象一样。 我们可以使用它们在软件层之间传输数据。 如果软件层或服务运行在不同的远程节点上,如微服务环境或遗留Java企业应用程序中。 我们必须做两个类的几乎完全相同的副本。 这是我们遇到DTO的地方。

|-----------| |--------------| | SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE | |-----------| |--------------| 

在传统的Java企业系统中,DTO可以有各种EJB的东西。

我不知道这是一个最佳实践,但我个人在我的Spring MVC / Boot Projects中使用了Value Objects

  |------------| |------------------| |------------| -> Form | | -> Form | | -> Entity | | | Controller | | Service / Facade | | Repository | <- View | | <- View | | <- Entity / Projection View | | |------------| |------------------| |------------| 

控制器层不知道实体是什么。 它与窗体视图值对象进行通信。 表单对象具有JSR 303validation注释(例如@NotNull)和视图值对象具有用于自定义序列化的jackson注释。 (例如@JsonIgnore)

服务层通过使用实体对象与存储库层进行通信。 实体对象具有JPA / Hibernate / Spring Data注释。 每层只与下层进行通信。 由于循环/循环依赖性,层间通信被禁止。

 User Service ----> XX CANNOT CALL XX ----> Order Service 

一些ORM框架可以通过使用额外的接口或类来进行投影。 所以存储库可以直接返回View对象。 在那里你不需要额外的转换。

例如,这是我们的用户实体:

 @Entity public final class User { private String id; private String firstname; private String lastname; private String phone; private String fax; private String address; // Accessors ... } 

但是,您应该返回一个包含id,firstname,lastname的分页列表。 然后,您可以创build一个用于ORM投影的视图值对象。

 public final class UserListItemView { private String id; private String firstname; private String lastname; // Accessors ... } 

您可以轻松地从存储库层获取分页结果。 多亏了spring,你也可以使用接口投影。

 List<UserListItemView> find(Pageable pageable); 

不要担心其他转换操作BeanUtils.copy方法工作得很好。

1)对我来说,什么是DTO的问题的最佳答案是DTO是简单的对象,不应包含任何需要testing的业务逻辑或方法实现。

2)通常情况下,您的模型(使用MVC模式)是智能模型,它们可以包含很多/某些方法,专门针对该模型执行一些不同的操作(而不是业务逻辑,这应该在控制器上)。 然而,当你传输数据(例如,从某个地方调用REST(GET / POST / whatever)端点,或者使用soa等等来使用web服务时),你不想传输大尺寸的对象,对端点来说是必要的,会消耗数据,并减缓传输。

使用MVC数据传输对象通常用于将领域模型映射到最终将由视图显示的更简单的对象。

维基百科 :

数据传输对象(DTO),以前称为值对象或VO,是用于在软件应用程序子系统之间传输数据的devise模式。 DTO通常与数据访问对象一起使用来从数据库检索数据。

Interesting Posts