一种DTO的规划方案
现在以网页发布的软件非常普遍,叫BS模式。前后端分离也是大趋势,或者说逐渐普及开来,深受前后端程序员的喜爱,我还是习惯以程序员来泛称所有软件制作者。后端需要把数据传送给前端,往往是通过DTO的序列化来实现的,而不是直接产生json或xml格式的数据。这里不说为什么要用DTO,只说探讨一个问题,不同的api接口(方法)返回不同格式的数据,这些DTO要如何设计。
特别说明,以下说到的DTO,是指DTO类,而不是DTO实例。虽然O应该是指实例,但这里继续用这个词,不阻碍意思的表述。
方案一,需要什么造什么。
这个方案简单,每个接口需要的数据结构不同就造不同的DTO,相同就复用。一般情况下能复用的不多,于是会出现大量的DTO,这些DTO的命名和管理成为难题。若规定一个接口独立使用一个DTO,则写这些DTO的工作量不小。还有一种粗糙的办法,假设有100个DTO,把它们按相近程度划分为少数若干类DTO,假设10类吧,然后同一类的DTO属性合并成一个DTO,这样确实能有效减少DTO的数量,但在具体的应用时,会多出来许多很是奇怪的属性。不可取。
方案二,照着对象造DTO
这里的对象可以简单理解为数据表,一个数据表对应一个DTO,但是多对多的关系表不对应DTO。造出来的DTO基本上与数据表的数量一样多(含统计功能的查询除外),有效的控制了DTO的数量,命名也方便。一个缺点是每个表的全部字段不管是否用到都在DTO中,有些字段只在少数情况下使用的,也得到处出现。另一个缺点是在DTO之间的关系上几乎总是造成循环引用。比如子对象往往要引用父对象,而父对象也有子对象的集合。不同接口往往只需要表现其中一个方向,但做出来的两个DTO类之间就必然有这种相互引用的关系,在自动生成api文档的时候,这种循环引用会是个问题,至今没有找到好的解决办法。
方案三,一个对象对应N个DTO
这N个DTO我作了规划:
类型 | 基类 | 范围 |
---|---|---|
DTO1 | 只有ID和Name | |
DTO2 | DTO1 | 只有常用的属性 |
DTO3 | DTO2 | 有全部的属性,但不包含IsDeleted这类特殊的附加属性 |
DTO4 | DTO3 | 包含了父对象 |
DTO5 | DTO3 | 包含了子对象 |
DTO6 | DTO4 | 包含了父对象和子对象 |
DTO4,DTO5,DTO6引用其它的DTO,作为泛型在具体使用的时候传入,并约束为对应的DTO1本身或子类。
这样,就可以以有限的数量的DTO,来组合表达足够灵活的结构,同时不会有输出太多多余的属性的情况。
也能解决DTO之间的循环引用问题,从而能使用swagger等生成api文档。
以学生和班级为例:
- 需要按条件查到若干个学生和每个学生对应的班级名称,则是结构是:
List<学生3<班级1>> 学生列表;
- 需要得到若干个班级,以及每个班级的部分符合指定条件的学生
List<班级5<学生2>>
- 需要得到指定老师所教的全部班级的学生,则是
老师5<班级5<学生2>>
缺点也是有的,DTO有6个,虽然有继承,不用重复写,但总比只有1个DTO要多写点代码。另外,这些DTO如何区分命名比较好,也是一个有待进一步完善的问题。如上表,是以数字123456区分的,应该有更好的命名方案。
- 2019-03 经过项目的实际使用, 调整为以下方案, 更适应实际的应用的需要。
类型 | 基类 | 范围 |
---|---|---|
DTO1 | ID和Name(Code) | |
DTO2 | DTO1 | 只有常用的属性 |
DTO3 | DTO2 | 全部属性(不包含IsDeleted这类特殊的附加属性,下同) |
DTO4 | DTO2 | 常用属性+父对象 |
DTO5 | DTO2 | 常用属性+子对象 |
DTO6 | DTO4 | 常用属性+父对象+子对象 |
DTO7 | DTO3 | 全部属性+父对象 |
DTO8 | DTO3 | 全部属性+子对象 |
DTO9 | DTO7 | 全部属性+父对象+子对象 |
一种DTO的规划方案的更多相关文章
- 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案
作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一 ...
- DB 分库分表(5):一种支持自由规划无须数据迁移和修改路由代码的 Sharding 扩容方案
作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一 ...
- IT基础架构规划方案一(网络系统规划)
背景 某集团经过多年的经营,公司业务和规模在不断发展,公司管理层和IT部门也认识到通过信息化手段可以更好地支撑公司业务运营.提高企业生产和管理效率.同时随着新建办公 ...
- IT基础架构规划方案二(计算机系统与机房规划规划)
计算机系统规划 服务器硬件选型规划方案 根据对某集团的实际调研,获取了企业业务应用系统的建设情况,随着企业信息化建设的推进,需要对各种信息化管理系统和应用系统的服务器选型进行选 ...
- IT基础架构规划方案三(IT基础软件和系统规划)
IT基础软件和系统规划 操作系统选型规划方案 根据对某集团的实际调研,获取了企业业务应用系统的建设情况,随着企业信息化建设的推进,需要对各种信息化管理系统和应用系统的服务器选型进行选型规划,根据不同的 ...
- IT基础架构规划方案之实际网络设计案例
根据某集团总部新办公大楼.厂房和分支机构(店面)的情况,以及IT部门对网络节点数.网络应用和分支机构(店面)的初步规划,对企业的总体网络拓扑结构进行设计,如下图. 设备选型和部署参考: 类型 设备选型 ...
- 深度点评五种常见WiFi搭建方案
总结十年无线搭建经验,针对企业常见的五种办公室无线网络方案做个简要分析,各种方案有何优劣,又适用于那种类型的企业. 方案一:仅路由器或AP覆盖 简述:使用路由器或AP覆盖多个无线盲区,多个AP的部署实 ...
- Atitit。sql2016标准化的规划方案 v3 q2a
Atitit.sql2016标准化的规划方案 v3 q2a 1. Sql标准化的历史3 1.1. Sql92标准4 1.2. Sql99标准4 1.3. SQL:2003为例,它包括以下9个部分 5 ...
- 三种UIScrollView嵌套实现方案
背景 随着产品功能不断的迭代,总会有需求希望在保证不影响其他区域功能的前提下,在某一区域实现根据选择器切换不同的内容显示. 苹果并不推荐嵌套滚动视图,如果直接添加的话,就会出现下图这种情况,手势的冲突 ...
随机推荐
- codeforces-1131 (div2)
A.把右上角的凹缺口补上变成凸的就成了规则矩形 #include <map> #include <set> #include <ctime> #include &l ...
- Docker-CentOS7-安装
yum install -y docker 可以看到,已经安装上docker了,并且没有报什么错误 启动docker,并查看运行状态 停止docker,并查看运行状态 启动完 docker后,可以查看 ...
- 爬虫框架Scrapy 之(二) --- scrapy文件
框架简介 核心部分: 引擎.下载器.调度器 自定义部分: spider(自己建的爬虫文件).管道(pipelines.py) 目录结构 firstSpider firstSpider spiders ...
- MySql的Communications link failure解决办法
在使用JDBC连接mysql时可能会遇到以下错误: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications li ...
- PHP带参数传值调用python脚本
PHP主要用在服务器端做网站后台开发,有些功能用PHP来实现有点费劲或者无法实现,现在在学习python,同样是脚本语言,感觉python能做的事情PHP不一定能胜任.但是现在大部分的网站后台也是用P ...
- mysql—常用查询语句总结
关于MySQL常用的查询语句 一查询数值型数据: ; 查询谓词:>,=,<,<>,!=,!>,!<,=>,=< 二查询字符串 SELECT * FROM ...
- Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬虫框架整合
简介:给正在学习的小伙伴们分享一下自己的感悟,如有理解不正确的地方,望指出,感谢~ 首先介绍一下这个标题吧~ 1. Scrapy:是一个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待 ...
- vue.js学习系列-第一篇(代码)
<html> <head> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"> ...
- PC设置局域网打印机
打印机采用局域网网络连接方式,下面以Windows系统为例说明如何添加此打印机. 将电脑接入局域网 在“控制面板”中打开“设备与打印机”,点击“添加打印机” 在弹出列表中,会自动出现打印机型号,选中它 ...
- iOS里的crc校验问题
首先推荐一篇文章,下面的的文章对crc解释的很好: https://blog.csdn.net/liyuanbhu/article/details/7882789 crc校验算法的本质就是对一个2进制 ...