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
方法工作得很好
GET
/POST
/无论什么)端点,或使用SOA使用Web服务等)时,您不希望使用端点不需要的代码传输大尺寸对象,这将消耗数据,并减慢传输速度 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