首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > ASP >

三层架构中施用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)

2012-09-08 
三层架构中使用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)用三层架构开发项目,经常会遇到如下

三层架构中使用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)

      用三层架构开发项目,经常会遇到如下场景:

      D层负责与数据库交互,一般是得到DataTable或DataSet对象,然后返回给B层,B层进行类似的处理来读取数据:dt.Rows[0][“xxx”];或者dt.Rows[0][1];(强烈不建议使用)。

      有时DataTable也会被传到UI层,与控件进行绑定,显示数据。例如ASP.NET的repeater控件提取数据:<%# Eval(“xxx”)%>。

      无论是何种情况,使用DataTable不可避免的要填写读取的字段,这样做的坏处不言而喻:

      |  非常容易写错,而且编译器不检查。

      |  必须了解数据库的结构。

      |  不符合面向对象编程思想。

      |  DataTable为弱类型,无法直观的看出字段的数据类型。

      这个问题一直困扰着我,这次借着重构机房收费系统的机会,研究了一下这个问题,找到了一种比较好的解决方案:在D层把DataTable转换成单个实体类,再把实体类填充到泛型集合中。


核心思想如图:


三层架构中施用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)

     实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,存放到实体类的属性中,再把所有的实体类存在泛型集合中。因此,DataTable中有多少个记录,泛型集合中就有多少个实体类,每个实体类的属性和DataTable的字段是相对应的。

     试想一下,这样一来,传到B层或U层的将是一个实体类集合,读取数据将会是如下场景:list[0].xxx;

     这样做的优点如下:

     |  编写B层的人员无需手动填写需要的字段,直接按一下点,全都提示出来了,想用哪个用哪个,不会出现写错的情况。

     |  不必了解数据库结构。

     |  符合面向对象思想。

     |  实体类的属性是强类型,每个字段的类型都是已知的。

 

     那么用代码如何实现呢?下面一一列举。

     注意:以下代码仅仅是为了模拟,有些不规范的地方,代码注释中有提示,切勿模仿!

 

实体类代码:



为了演示,程序做如下变动:

 

在Entity项目中添加一个LoginLog类,用户登录日志:


create database testDB;use testDB;create table t_Users(id bigint IDENTITY(1,1) PRIMARY KEY,userName varchar(100) NOT NULL UNIQUE,passWord varchar(100) NOT NULL);insert into t_Users(userName,passWord) values('admin','123');insert into t_Users(userName,passWord) values('guest','456');create tabLe t_LoginLog(id bigint IDENTITY(1,1) PRIMARY KEY,userName varchar(100),loginTime datetime NOT NULL,logoutTime datetime NOT NULL,CONSTRAINT FK_LoginLog_userName FOREIGN KEY(userName) REFERENCES t_Users(userName));insert into t_LoginLog(userName,loginTime,logoutTime)values('admin','2012-7-30','2012-7-30');insert into t_LoginLog(userName,loginTime,logoutTime)values('guest','2012-8-30','2012-8-30');insert into t_LoginLog(userName,loginTime,logoutTime)values('admin','2012-9-30','2012-9-30');insert into t_LoginLog(userName,loginTime,logoutTime)values('guest','2012-10-30','2012-10-30');

本文示例完整源码:

点我下载


热点排行