分布式应用架构中的数据传输对象(DTO

Written by: Rickie Lee

Dec. 1, 2004

在分布式架构中,相关层在物理部署上实现分离,通过网络或跨进程调用远程对象或服务。在这种分布式架构中,需要定义有效的数据传输对象(Data Transfer Object, DTO)来实现层与层之间的数据传输。

因为远程调用需要跨越网络或进程,因此会比较慢。通过使用DTO,在单一远程调用中传输更多的数据信息,减少远程调用的次数,提高分布式调用的性能。

下面分析一些比较常用的数据传输对象(DTO):

1DataSet

DataSet是缓存在内存中的表,它是从关系数据库或 XML 文档中获得的。可以使用 DataSet来表示从数据库中检索到的业务实体数据,然后可以在层与层之间使用DataSet来传递数据。Microsoft提供的范例Duwamish 7.0中使用大量的DataSet来实现层与层之间的数据传递,如Presentation层与BusinessFacade层等等。

优点:(1)DataSet类由.Net Framework内置实现,不必编写和维护额外的类。(2)DataSet可以与Windows Form和Web Form的内置控件直接交互,如DataGrid等。(3)DataSet支持序列化XML,不仅包括内容序列化,还包括Schema。(4)非连接的数据模式。(5)DataSet 可以包含数据的集合,能够表示复杂的数据关系。

缺点:(1)互操作性问题,因为DataSet类是ADO.NET提供的,因此要求Client端在.Net Framework平台上运行。(2)陈旧的数据,因为DataSet包含的数据是Database的快照,如果Database的数据经常改变,则不推荐采用DataSet。(3)依赖Database schema,访问DataSet中数据时,要求显式指定字段类型和数据表之间的关系,如果Database schema发生变化,相应的code也要变化。要访问 DataSet 中的表,客户端代码必须使用整数索引生成器或字符串索引生成器来索引 DataTable 集合。要访问特定列,必须使用列编号或列名称索引 DataColumn 集合。(4)缺乏类型安全,当从DataSet中取值时,需要显式指定要转换的数据类型,这样容易产生错误。(5)性能问题。实例化和封送处理 DataSet 会增加运行时负担。

2.有类型的DataSet

有类型的DataSet是从 ADO.NET DataSet 类继承而来的类,包含具有严格类型的方法、属性和类型定义以公开 DataSet 中的数据和元数据的类。

优点:除了上述DataSet的部分优点外,有类型的 DataSet 还提供了数据验证支持(在编译时进行类型检查,无效的表名称和列名称将在编译时而不是在运行时检测),并且简化代码的编写,提高代码的可读性。

缺点:(1)具有DataSet的大部分缺点,除了提供类型安全。(2)另外,需要编写或维护用来描述typed interface的XML Schema,不过幸好VS.Net IDE提供工具支持。(3)部署问题。必须将包含有类型的 DataSet 类的程序集部署到使用业务实体的所有层。(4)可扩展性问题。如果修改了数据库架构,则可能需要重新生成有类型的 DataSet 类以支持新架构。重新生成过程将不会保留在有类型的 DataSet 类中实现的任何自定义代码。必须将包含有类型的 DataSet 类的程序集重新部署到所有客户端应用程序中。

有类型的方法和属性的提供使得使用有类型的 DataSet 比使用通用 DataSet 更方便。使用有类型的 DataSet 时,IntelliSense 将可用。有类型的 DataSet 的实例化和封送处理性能与通用 DataSet 基本相同。

3.自定义业务实体(Business Entity

这是一种自定义类,用于表示各种业务实体类型。可以定义保存业务实体数据的字段,并定义将此数据向应用程序各层中公开的属性(getter/setter),或者进一步使用在该类中定义的字段来定义方法以封装简单的业务逻辑。

应当封装应用程序的功能的核心业务实体,而不是为每个表定义单独的业务实体。

优点:(1)可维护性,更改架构一般不会影响数据访问逻辑组件方法签名。(2)相对DataSet而言,有更好的性能。(3)编译期间提供类型安全检测。(4)代码易读。要访问自定义实体类中的数据,可以使用有类型的方法和属性。(5)自定义实体可以包含方法以封装简单的业务规则。(6)本地化验证。自定义实体类可以在其属性存取器(getter/setter)中执行简单的验证测试以检测无效的业务实体数据。(7)专用字段。可以隐藏不希望向调用程序公开的信息。

缺点:(1)需要编写并维护自定义DTO类。(2)自定义实体表示的是单个业务实体,而不是一个业务实体集合。要保存多个业务实体,调用应用程序必须创建一个数组或一个 .NET 集合。(3)必须在自定义实体中实现自己的序列化机制。可以使用属性来控制实体组件的序列化方式,也可以通过实现 ISerializable 接口来控制自己的序列化。(4)部署问题。必须在所有物理层部署包含自定义实体的程序集。(5)可扩展性问题。如果修改了数据库架构,则可能需要修改自定义实体类并重新部署程序集。

4.简单标量参数列表

根据需要传入的参数,传入一系列简单的标量值。

优点:(1)标量值本身支持序列化。(2)内存使用效率高,标量值只传递实际调用需要的数据。(3)更高的性能。(4)最明显的特点是简单方便。

缺点:(1)紧密耦合与维护。架构的更改可能需要修改方法签名,这会影响调用代码。(2)有可能存在进行多次单独的方法调用,这在分布式环境中会给性能带来很大影响。(3)难以表达复杂的数据关系。

当然,在实际的分布式应用系统中,会根据实际情况的要求,使用不同的DTO对象。

下面通过描述简单的分布式应用架构模型设计,来演示DTO对象在层与层之间的数据传递和交互:

References:

1. Angela Crocker, Andy Olsen, Edward Jezierski, Microsoft, 设计数据层组件并在层间传递数据, http://www.microsoft.com/china/msdn/archives/library/dnbda/html/BOAGag.asp

分布式应用架构中的数据传输对象(DTO)相关推荐

  1. ABP 详解系列2:解析ABP框架中的数据传输对象与应用服务

    解析ABP框架中的数据传输对象与应用服务 ABP框架是基于ASP.NET的Web开发框架,在ABP中应用服务将领域逻辑暴露给展现层,展现层通过传入数据传输对象参数来调用应用服务,而这里我们就来解析AB ...

  2. ABP理论学习之数据传输对象(DTO)

    本篇目录 为何需要DTO 领域层抽象 数据隐藏 序列化和懒加载问题 DTO惯例和验证 DTO和实体的自动映射 使用特性和扩展方法进行映射 帮助接口 DTO用于应用层和 展现层间的数据传输. 展现层调用 ...

  3. 为什么需要DTO(数据传输对象)

    DTO即数据传输对象.之前不明白有些框架中为什么要专门定义DTO来绑定表现层中的数据,为什么不能直接用实体模型呢,有了DTO同时还要维护DTO与Model之间的映射关系,多麻烦. 然后看了这篇文章中的 ...

  4. 我们为什么需要DTO(数据传输对象)

    DTO即数据传输对象.之前不明白有些框架中为什么要专门定义DTO来绑定表现层中的数据,为什么不能直接用实体模型呢,有了DTO同时还要维护DTO与Model之间的映射关系,多麻烦. 然后看了这篇文章中的 ...

  5. Java中常见的对象类型简述(DO、BO、DTO、VO、AO、PO)

    PO(bean.entity等命名): Persistant Object持久对象,数据库表中的记录在java对象中的显示状态 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作 ...

  6. DTO数据传输对象详解

    文章目录 一.DTO是什么? 二.DTO解决的问题 三.代码演示 一.DTO是什么? DTO (数据传输对象) 数据传输对象(DTO),是一种设计模式之间传输数据的软件应用系统.数据传输目标往往是数据 ...

  7. Spring Boot笔记-对dto数据传输对象及物联网公司主创建主键的认识

    目录 基本概念 相关代码 基本概念 dto指:data transfer object,数据传输对象. 以本人目前的Java web水平,对此dto有如下的认识. 数据库列映射为java类的时候,如果 ...

  8. java中bean对象_JAVA中PO,BO,VO,DTO,POJO,Entity,JavaBean,JavaBeans各个对象的区别,以及lombo、jpa简介及用法...

    常见JAVA类概念介绍 PO:持久对象 (persistent object). 是ORM(Objevt Relational Mapping)框架中Entity,PO属性和数据库中表的字段形成一一对 ...

  9. [SpringBoot] [使用]经典三层架构及“DO/BO/VO/DTO“对象总结

    前言 突然想写点关于SpringBoot相关使用方便的文章. 之前进行了2个月的项目重构, 于是先给大家介绍一下几种经典的项目组成. 三层架构 经典的三层架构主要是Dao/Service/Contro ...

最新文章

  1. android网络编程之HttpUrlConnection的讲解--GET请求
  2. php上传头像的代码,php头像上传预览实例代码
  3. 系统级性能分析工具perf的介绍与使用
  4. vs2005 + ASP.NET 页面布局应注意问题及方法步骤
  5. vs2013调试linux程序,vs 2013调试的时候重启的解决方案
  6. mac os 升级为Mountain Lion后,eclipse找不到JRE的问题
  7. .Net Core创建Docker镜像
  8. 多库操作:多个数据库的动态切换(一)
  9. 吉吉王国(二分+树形dp)
  10. Windows Embedded CE 6.0开发初体验(三)设置Boot-loader
  11. 7-207 排序 (25 分)
  12. 编程之美2014 资格赛题目3 : 格格取数
  13. python实现二分法查找_python二分法查找
  14. Windows Server 2003群集配置手记(转载)
  15. echarts柱状图渐变色
  16. 有机酸的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. 使用hector构图_如何使用均衡的构图拍摄更清晰的照片
  18. 普拉提瑜伽工作室行业调研报告 - 市场现状分析与发展前景预测
  19. 2.1.1队列——雏形(初始版本)
  20. (金融入门知识点)Double类型丢失精度

热门文章

  1. VTK:几何对象之QuadraticTetra
  2. VTK:Filtering之ConnectivityFilterDemo
  3. OpenCV阈值范围Threshold inRange的实例(附完整代码)
  4. OpenCV解码格雷码模式
  5. Qt Creator在设计模式下编辑3D资产
  6. 标准 C++ I/O
  7. C语言中的变量是怎么回事?
  8. android4 设置栈大小,【技术分享】Android内核漏洞利用技术实战:环境搭建栈溢出实战...
  9. 一点通路由器模拟软件最新版_驾校宝典通最新版2020下载-驾校宝典通手机版 v1.0.2免费版...
  10. 13.4.虚拟化工具--jmap详解