Model view controller 什么是数据传输对象(DTO)?

Model view controller 什么是数据传输对象(DTO)?,model-view-controller,architecture,dto,data-transfer,data-transfer-objects,Model View Controller,Architecture,Dto,Data Transfer,Data Transfer Objects,什么是数据传输对象 MVC中有模型类DTO,如果没有,区别是什么?我们需要两者吗?MVC数据传输对象通常用于将域模型映射到更简单的对象,这些对象最终将显示在视图中 发件人: 数据传输对象(DTO),以前称为值对象或VO,是 用于在软件应用程序之间传输数据的设计模式 子系统。DTO通常与数据访问结合使用 对象从数据库检索数据 可以在上找到DTO的定义。DTO用于将参数传递给方法并作为返回类型。很多人在UI中使用这些对象,但其他人会从中膨胀域对象。DTO是一个愚蠢的对象-它只包含属性,有getter

什么是数据传输对象


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

MVC数据传输对象通常用于将域模型映射到更简单的对象,这些对象最终将显示在视图中

发件人:

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


可以在上找到DTO的定义。DTO用于将参数传递给方法并作为返回类型。很多人在UI中使用这些对象,但其他人会从中膨胀域对象。

DTO是一个愚蠢的对象-它只包含属性,有getter和setter,但没有任何其他重要的逻辑(除了
compare()
equals()
实现)


通常MVC中的模型类(此处假设.net MVC)是DTO,或DTO的集合/聚合。数据传输对象是用于封装数据并将其从应用程序的一个子系统发送到另一个子系统的对象

DTO最常用于N层应用程序中的服务层,用于在自身和UI层之间传输数据。这里的主要好处是,它减少了分布式应用程序中需要跨线发送的数据量。他们还可以在MVC模式下制作出色的模型


DTO的另一个用途是封装方法调用的参数。如果一个方法需要四个或五个以上的参数,这可能很有用

在使用DTO模式时,还可以使用DTO汇编程序。汇编程序用于从域对象创建DTO,反之亦然


从域对象到DTO再到DTO的转换可能是一个代价高昂的过程。如果您不创建分布式应用程序,您可能不会看到该模式带来的任何好处,因为。

一般来说,值对象应该是不可变的。类似于Java中的整数或字符串对象。我们可以使用它们在软件层之间传输数据。如果软件层或服务运行在不同的远程节点上,如microservices环境或传统Java企业应用程序中。我们必须制作两个班级的几乎完全相同的副本。这就是我们遇到DTO的地方

|-----------|                                                   |--------------|
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE |
|-----------|                                                   |--------------|
在传统的Java企业系统中,DTO可以包含各种EJB内容

我不知道这是否是最佳实践,但我个人在我的Spring MVC/Boot项目中使用了值对象,如下所示:

        |------------|         |------------------|                             |------------|
-> Form |            | -> Form |                  | -> Entity                   |            |
        | Controller |         | Service / Facade |                             | Repository |
<- View |            | <- View |                  | <- Entity / Projection View |            |
        |------------|         |------------------|                             |------------|
一些ORM框架具有通过使用附加接口或类进行投影的能力。因此存储库可以直接返回视图对象。因此,您不需要额外的转换

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

@实体
公共最终类用户{
私有字符串id;
私有字符串名;
私有字符串lastname;
私人电话;
私人字符串传真;
私有字符串地址;
//访问者。。。
}
但您应该返回一个分页的用户列表,其中只包括id、firstname和lastname。然后可以为ORM投影创建视图值对象

公共最终类UserListItemView{
私有字符串id;
私有字符串名;
私有字符串lastname;
//访问者。。。
}
您可以很容易地从存储库层获得分页结果。得益于spring,您还可以仅使用界面进行投影

列表查找(可分页);
不要担心其他转换操作
BeanUtils。copy
方法工作得很好

  • 对我来说,什么是DTO这个问题的最佳答案是DTO是简单的对象,不应该包含任何需要测试的业务逻辑或方法实现
  • 通常,您的模型(使用MVC模式)是智能模型,它们可以包含许多/某些方法,专门为该模型执行一些不同的操作(不是业务逻辑,这应该在控制器上)。但是,当您传输数据(例如,从某处调用REST(
    GET
    /
    POST
    /无论什么)端点,或使用SOA使用Web服务等)时,您不希望使用端点不需要的代码传输大尺寸对象,这将消耗数据,并减慢传输速度
  • 数据传输对象(DTO)描述“承载数据的对象” “进程之间”(Wikipedia)或“用于封装数据的对象, 并将其从应用程序的一个子系统发送到另一个子系统”(堆栈溢出) 回答)。

    DefN

    DTO是一种硬编码的数据模型。它只解决了由硬编码生产过程处理的数据记录建模问题,其中所有字段在编译时都是已知的,因此通过强类型属性访问

    相反,动态模型或“属性包”解决了在运行时创建生产流程时对数据记录建模的问题

    Cvar

    DTO可以用字段或属性建模,但有人发明了一种非常有用的数据容器,称为Cvar。它是对值的引用。当使用我称之为的引用属性对DTO建模时,可以将模块配置为共享堆内存,从而协同工作。这完全消除了代码中的参数传递和O2O通信。换句话说,具有引用属性的DTO允许代码实现零耦合

        class Cvar { ... }
    
        class Cvar<T> : Cvar
        {
            public T Value { get; set; }
        }
    
        class MyDTO
        {
            public Cvar<int> X { get; set; }
            public Cvar<int> Y { get; set; }
            public Cvar<string> mutableString { get; set; } // >;)
        }
    
    我的协作架构取代了设计模式。请参阅我的网络文章

    参数提供对堆叠机架机器的即时控制。如果您使用连续控制,因此不需要立即控制,则您的模块不需要参数。我的
        class Cvar { ... }
    
        class Cvar<T> : Cvar
        {
            public T Value { get; set; }
        }
    
        class MyDTO
        {
            public Cvar<int> X { get; set; }
            public Cvar<int> Y { get; set; }
            public Cvar<string> mutableString { get; set; } // >;)
        }
    
        // a dynamic DTO
        class CvarRegistry : Dictionary<string, Cvar> { }
    
        return View(model);  // MVC disagrees