业务层应该返回DataSet/DataTable,还是对象/对象集合?
今天看到了思归的博客里面的一篇文章,感觉很有同感:
…………………………
假如你的应用inherently没什么业务逻辑或者你的应用很简单,或者你的目的就是把数据库里的数据显示出来,那就用DataSet/DataTable好了。DataSet/DataTable到底提供了不少有用的方法(过滤/排序/。。。),而且具有在修改后端数据库后,不用修改中间编码,修改显示层的绑定编码即可将变动反应出来的灵活性。
但DataSet/DataTable往往反映了你的数据库里的Schema,你的表现层跟你的数据库里的东西的耦合如此之强,是否恰当,应该是个需要考虑的问题。但一想到DataSet/DataTable如此地方便,灵活,而且因此编码过程效率很高,何乐不为呢?
而且,一般来说,你的应用并不是只用来显示数据的,往往需要编辑(添加/修改/删除)数据。但DataSet/DataTable这样的容器提供了很好的功能,能帮你记住你的数据的状态,很符合Martin Fowler的PEAA一书里的Unit of Work模式。然后到最后,你可以用DataAdapter一次性地(虽然其中操作并不是一次性)把数据更新到数据库去。
然后你就会在很多地方操作DataSet/DataTable,即使编码难以避免地会有点重复,而且你是在直接操作数据,心里会有点不安,但想到DataSet/DataTable的种种好处,哎,这么方便。。。。before you know it,类似的操作会散居各个逻辑层,哎,什么domain model,我这database-driven programming也蛮好的。。。等到要维护时,或需要改版时再看,业务逻辑象映山红般满山遍野。。。。哎,反正我的项目比较小,重头开始吧。。。。If you didn't learn anything here, we will be looking forward to another unmaintainable project
…………………………
相关连接
1. Aaron Skonnard谈到从WebService返回DataSet对Interoperability的影响
2. Scott Hanselman又说,DataSet是只碗,不是水果,强类型DataSet是只上面画了个苹果的碗而已
3. Karl Seguin在MSDN上的文章“掌握 ASP.NET 之路:自定义实体类简介”里指出了DataSet的问题
4. Barry Gervin不同意,罗列了DataSet的种种好处
5. Jelle Druyts也不同意,称DataSet不是邪恶
6. 模式和实践里的2篇关于把DataSet用作DTO的文章,总结了其中的优弱点
Implementing Data Transfer Object in .NET with a DataSet
Implementing Data Transfer Object in .NET with a Typed DataSet
我是相当同意以上的观点的,不过用Domain Model在表示层编程的时候是很方便的,不过也有让我感觉头疼的地方,不错,就是O/R Mapping了。
一般来说有两种风格的Domain Model:
1. 每个对象对应于数据库中的表中一行。 Active Record模式
2. 有很多的对象(由于使用继承和模式,比如一个接口,多个实现类) Data Mapper模式
不过我没有那么讲究,项目里面大部分是用ActiveRecord模式,也就是PetShop的模式。遇到不好处理的位置(例如邮件附件和公文附件,根本就是相同的东西,却在两个表里面),就用DataMapper模式……。
转载于:https://www.cnblogs.com/zellzhang/archive/2005/07/01/184576.html
业务层应该返回DataSet/DataTable,还是对象/对象集合?相关推荐
- 架构语言ArchiMate -业务层(Business Layer)
在线ArchiMate1.0中对ArchiMate进行了详细的介绍,想学习的一些同事不太喜欢看英文资料,而年后项目组要开始做业务架构了,所以在春节前最后一天把对业务层的介绍写完.以下我将会分别对不同层 ...
- view是视图层+action是控制层+service是业务层+dao是数据访问层。
举例1:MVC 1)最上面的一层,是直接面向最终用户的"视图层"(View).它是提供给用户的操作界面,是程序的外壳. 2)最底下的一层,是核心的"数据层"(M ...
- java抛异常 代替返回_请问业务层方法是抛出一个异常好还是返回一个结果更好...
@Override public Response checkUserToken(long uid, String accessToken, String deviceToken){ Response ...
- [Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)...
点击下载 ConvertJson.rar 本类实现了 C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json| 等功能 大 ...
- 爱上MVC~业务层刻意抛出异常,全局异常的捕获它并按格式返回
对于业务层的程序的致命错误,我们一直的做法就是直接抛出指定的异常,让程序去终断,这种做法是对的,因为如果一个业务出现了致命的阻塞的问题,就没有必要再向上一层一层的返回了,但这时有个问题,直接抛异常,意 ...
- DataSet DataTable DataReader DataAdapter之间的区别
1.四者各自的介绍 DataSet是用来做连接sql的一种方法,意思是把数据库的副本存在应用程序里,相当于存在内存中的数据库,应用程序开始运行时,把数据库相关数据保存到DataSet. DataTab ...
- 浅谈网页三层结构:表现层、业务层和数据层
转自:微点阅读 https://www.weidianyuedu.com 网页设计 三层结构 表现层.业务层和数据层 1. 表现层(Presentation Layer): 表现层用于用户接口的展示 ...
- 数据库-ADONET-在数据集DataSet中使用关系对象DataRelation处理关系
处理关系数据 数据库中,表很少是独立结构的,大部分数据库都包含相互关联的表. 在构建应用程序时,会遇到--显示或者通过程序设计访问数据库中相关表的数据的情况. 用户会希望,能通过在不同的表之间定位,来 ...
- 编写业务层和持久层事务控制代码并配置spring的ioc
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- 走向.NET架构设计—第五章—业务层模式,原则,实践(中篇)
走向.NET架构设计-第五章-业务层模式,原则,实践(中篇) 前言:设计模式并不是什么很高深的东西,至少不是那么"神乎其神".说到底,设计模式就是一些设计思想.下面我们就走进项目, ...
最新文章
- opencv数字图像处理(图像边缘)
- Abbirb120型工业机器人_工业机器人市场深度调研及投资前景预测报告2020-2024年
- mysql-5.7.10产生的日志时间与系统时间不一致
- (转)编译Android源码的全过程
- 图片格式之YUV420 转RGB格式(含代码)
- enumerable java_ruby中的Enumerable的使用
- [转] Android SDK manager 无法获取更新版本列表
- 12,mac phpstorm xdebug
- 个人学习进度(第四周)
- 计算机网络基础(一)
- WindowsX64下tftp的安装
- ubuntu命令行安装teamview
- 有两个水桶,一个可装7升水,一个装水3升,怎样量出2升
- C语言入门-绝对值(abs)
- 将靠父id的层级关系处理成编码形式
- 沙箱支付宝------简单实现支付
- matplotlib绘制饼图
- CLOB、BLOB , CLOB与BLOB的区别
- Android Jenkins + gradle 实现自动化打包流程并上传至蒲公英平台全过程
- php正则匹配汉字!
热门文章
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-2.快速搭建SpringBoot项目,采用IDEA...
- 收获,不止oracle
- [转]How do I use variables in Oracle SQL Developer?
- namenode 无法启动之每次开机需要重新格式化-tmp
- cocos2dx中的层CCLayer
- 编写带界面的ActiveX控件(CAB网页控件)全过程
- 滚动条----SCROLLBAR
- 从零开始学MySQL(四)
- 如何在ADO中使用数据读取器(DataReader)读取数据
- 如何用一款小工具大大加速MySQL SQL语句优化(附源码)