什么是数据转移的对象?

在视的类型也可与检,并且如果不是什么分歧,我们需要两个吗?

有帮助吗?

解决方案

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

DTO的最常在N层应用程序所使用的服务层自身和UI层之间传输数据。这里的主要好处是,它减少了需要在分布式应用程序跨网发送的数据量。他们在MVC模式也很适合当模特。

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

在使用DTO模式,也将利用DTO装配的。汇编程序被用于从域对象创建DTO的,反之亦然。

从域对象到DTO并再次返回的转化可以是一个昂贵的过程。如果你没有创建一个分布式应用程序,你可能不会看到从模式的所有极大的好处,如马丁福勒解释此处

其他提示

有关DTO的定义可以在 Martin Fowler的网站找到。 DTO的是用来传递参数的方法和返回类型。很多人使用那些在用户界面,但其他人他们夸大域对象。

一个DTO是一个哑对象 - 它只是保持性能,并具有getter和setter,但任何意义没有其它逻辑(也许比其它一个比较()或equals()方法实现)

。 在MVC

通常的模型类(这里假定.NET MVC)被DTO的,或集合/ DTO的聚集体

在一般的值对象应该是不可变的。像整数字符串中的Java对象。我们可以使用他们的软件层之间传输数据。如果软件层或服务,像在微服务环境或遗留的Java企业应用不同的远程节点上运行。我们必须使两类几乎精确副本。这是在这里我们遇到了DTO的。

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

在传统的Java企业系统的DTO可以有不同的EJB的东西在里面。

我不知道这是一个最好的做法或没有,但我个人使用值对象在我的Spring MVC /启动的项目是这样的:

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

<强>控制器层不知道是什么实体。它具有的表格查看值对象通信。形式对象具有(例如@NotNull)JSR 303验证注释和查看值对象有杰克逊注解用于自定义序列。 (例如@JsonIgnore)

服务层与存储库层经由使用实体对象进行通信。实体对象有它JPA /休眠/春数据注解。每一层只有下层通信。层间的通信,因为圆形/循环依赖的禁止。

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,名字,姓氏用户的分页列表。然后,您可以创建ORM投影视图值对象。

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

您可以很容易地从仓库层分页的结果。由于春天你也可以只使用接口,用于预测。

List<UserListItemView> find(Pageable pageable);

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

  1. 我最好的回答问题 什么是也可与检 是, 也可与检是很简单的对象不应包含任何商业逻辑或方法实现,这将需要测试.
  2. 通常情况下你的模式(使用视模式)的智能型,它们可以包含一个很大的一些方法,做一些不同的操作用于该模型具体说(不业务逻辑,这应该是在控制器).然而,当你传送数据(例如。叫其余部分(GET/POST/无论)的终结点从什么地方,或者消费一个服务使用SOA,etc...)你不想的发射的大型物体的代码不必要的终结点,将消耗数据,并放慢的转移。

使用MVC数据传输对象经常被用来域模型映射到将最终得到由所述视图中显示的简单的对象。

维基百科

  

数据传送对象(DTO),原名值对象或VO,是   使用的设计图案转移软件应用程序之间的数据   子系统。 DTO的通常与数据访问结合使用   对象以从数据库中检索数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top