浅谈ASP.NET三层结构模式

下面简单的总结一下对三层结构的理解
1、 数据访问层是通用的。
2、 实体类也是通用的。
3、 常用的功能(比如分页、联动下拉列表等)都写成了控件,自然也就是通用的了
先说一下数据访问层。
            简单的说就是对ado.net的进一步的封装 —— 简化功能的封装。ado.net是通用的,所以我的数据访问层自然也就是通用的了。
           想想我们需要的是什么?执行sql语句(比如添加、修改、删除)、返回记录集(存放在DataSet等对对象里面)。我的数据访问层也就是围绕这两个功能而展开
   直接使用 ado.net 的话要写好几行代码才能得到一个DataSet 。需要传入的参数:sql语句、存储过程的名称(存储过程的参数)。
根据实际情况判断具体传入什么参数,以及使用那些函数。(这些都是调用数据访问层的地方的事情。)
        返回类型:返回 void 、DataSet 、DataTable、DataRow、string[]、string,最近又增加了返回结构数组的功能,结构数组也就是“实体类”。
简单的说我的数据访问层就是这些接口。
下面举例说明我的数据访问层的使用方法:
比如我想在网站的首页里调用最后添加的五条资讯,然后绑定到Repeater控件上。
我可以这样写
 JYK.DataAccessLayer dal = new JYK.DataAccessLayer();          //实例化数据访问层
 Rpt_News.DataSource = dal.RunSqlDataTable (“select top 5 字段 from 表名 where 条件 排序等”);        //获得记录集
 Rpt_News.DataBind();
 
 dal. Dispose() ;//释放资源。
 
        短短几行就实现了功能,除了前台Repeater 里面需要再写点代码之外,其他的地方就不用再写任何的代码了。我感觉我的方法是相当的简介,你的感觉呢?
 
(当然首页里面不会只显示资讯就完事了,其他的也是类似的写法。也可以用
 DataSet ds = dal.RunSqlDataSet(sql语句)
 或者
 DataSet ds = dal.RunStoreDataSet(存储过程名称)
 
返回多个记录集。然后用 ds.Table[0]、ds.Table[1]…来绑定控件。)

数据访问层先说到这里,下面说说实体类
 
        一开始我是不用实体类的,因为感觉需要一个表对应一个实体类,如果是这样的话就太麻烦了。取代的是直接使用DataTable ,和数据访问层搭配用起来也是很简单的。
 
        后来发现 <%# DataBinder.Eval(Container, "DataItem.txt")%> 的绑定方法实在是效率太低了,后弃之不用,改成了 <%#((DataRowView)Container.DataItem)["Url"]%>。但是总感觉不爽。突然想起来以前有位高人提及自定义数据源绑定控件的方法。记忆已经很是模糊了,隐约感觉是使用了结构之类的东东。经过一段时间的摸索和实验,确定了自己的一种“实体类” —— 更准确的说就是结构(struct)数组。
 
//插叙
        让我们先来看看网页里的“元素”。想想上面那个显示资讯的例子,在页面里面(UI层)我们需要获取什么呢?链接网址、资讯标题、发表时间、人气、资讯图片的网址、资讯的简要介绍。(还有其它的吗?)
 
        根据我的编写网站的经验,这些已经足够了。也就是说结构(struct)里面定义这些属性就足够一般的页面(首页和列表页面)使用了。当然在实际中我又加了一个ID的属性。
//插叙结束
 
        通用的实体类,也就是说不管是资讯还是文件下载还是其它的什么,都用具有这些属性的结构数组来保存记录集。再在数据访问层里面增加一个函数来返回结构数组(就像返回DataTable 那样的函数)。前台调用也是很方便,不仅可以绑定到控件,而且可以直接使用 for 循环来显示数据(仿佛回到了asp的时代J)。因为for更加的灵活,是控件所无法比拟的!而且可以很轻松的应对美工给的不好循环的页面。
 
绑定控件的写法
 <%# ((BaseTitle)Container.DataItem).URL%>
 <%# ((BaseTitle)Container.DataItem).Title%>
 <%# ((BaseTitle)Container.DataItem).ImagePath%>
 <%# ((BaseTitle)Container.DataItem).Hits%>
……
 
for的写法。(后台定义 myData,并使用我的数据访问层填充数据)
 <%= myData[i].URL%>
 <%= myData[i]..Title%>
 <%= myData[i]..ImagePath%>
 <%= myData[i]..Hits%>
 
相同的写法,不用考虑具体的字段名称,那里使用复制到哪里就可以了,是不是很方便。


下面总结一下:
 
UI层 : aspx页面
 
逻辑层,分为两种情况:
在项目里面只出现一次的函数,直接写在aspx.cs页面;
在项目里面会多次出现的函数,写在.cs文件里面。(比如登录、验证用户登录信息等)
大量使用自定义控件来简化编码。
 
数据访问层:调用dll文件,无需重复编写代码。
 
当然这么看起来的话好像变成了一层的代码,因为代码都写在了 aspx和aspx.cs里面了。
 
我采用的是分层的思路,而不是分层的形式!
 
不知道我有没有说明白。
 
我的表述能力比较差,请多多原谅。
 
先写这些,具体的以后慢慢写。 

你可能感兴趣的:(技术文章转载)