首页蓝耳朵|小小蓝耳朵广州图书馆外文室英语儿童读物资源介绍网佛教青年之友旧版收集永硕E盘Phonics Short Vowels Game 
扩展《ASP.NET 2.0 开发指南》第10章第5节 ObjectDataSource控件(三层应用程序)
所属栏目:ASP.NET(webform)  时间:2010-06-12 17:30  作者:狼子

先记录两个连接:

2006-07-14 学习《asp.net2.0开发指南》P315包含业务组件的三层应用程序的例子:http://www.nnllok.cn/myBlog/archives/2006/2296.html

2009-08-19 重读《ASP.NET 2.0 开发指南》第10章第5节 ObjectDataSource控件(三层应用程序):http://www.nnllok.cn/Manage/NewsAdd.aspx

2010?-05-?24?到2010-06-12断断续续的又重新看了一遍,这一回,我按三层结构的项目把这部分代码全都分解开了

文件结构图:

下面是笔记:

《ASP.NET 2.0 开发指南》三层结构(Three Tier Architecture)学习笔记

1、示例数据库使用MS SQL 2000的pubs数据库,涉及数据表:authors,涉及字段:au_id,au_fname,au_lname,state

2、DAL:数据访问层(Data Access Layer),直接对数据库进行操作,仅仅是对数据库进行操作,不对数据有效性等进行验证,操作数据
  这里需要添加引用:System.Configuration,对应数据库的连接字符串应该写在调用的DAL的web网站的web.config文件里,而不是DAL项目的app.config里
  对应:P295数据访问类AuthorDB.cs

3、业务逻辑层
①、Models:业务模型,把关系数据映射到业务实体,即把数据库里的字段名,对应为某个对象里的公共属性,这样子,可以把数据库里的字段名,转成程序员熟悉明了的对象属性名,还可以给每个属性加上注释,更明白
  对应:P316业务实体类Author.cs

②、BLL:业务逻辑类(Business Login Layer),对Models中定义的对象进行操作,实现这些模型到数据库中数据的映射,通过调用DAL中的方法,操作数据库,这里包括对数据进行服务器端验证,对返回的结果做判断性的返回等
  对应:P318 AuthorsComponent.cs
  该层需要添加项目引用:Models、DAL
  
  在这个类里面,GetAuthorsByState()、GetStates()因为要把Models里定义的模型对象和数据库中的字段对应上,以方便UI层直接使用Models里定义的对象,所以都直接用到了数据库的字段名
  GetAuthorsByState():
    foreach (DataRow row in ds.Tables[0].Rows)
    {
        authors.Add(new Author((string)row["au_id"], (string)row["au_lname"], (string)row["au_fname"], (string)row["state"]));
    }
    这里使用返回数据填充Author对象集合,这里把从DAL层返回的数据ds和Models中定义的对象Author对应起来了
   
    同样,GetStates():
    foreach (DataRow row in ds.Tables[0].Rows)
    {
        states.Add((String)row["state"]);
    }
   
    这两段,为了方便以后修改数据库,我转移到DAL层,放在DAL.AuthorDB.cs里了

4、UI:表现层(User Inerface),包含web窗体、页面用户界面等,完成两个任务:
  a.从BLL获取数据并显示给用户
  b.实现与用户交互(包括在客户端的数据验证、服务器端的事件触发调用等),将有关数据回送给BLL处理
  表现层操作的只是Models里定义的对象,通过调用BLL层的方法操作数据库
  该层需要添加项目引用:DLL
  对应P321源代码Default.aspx

在BLL层里把对象和字段的对应代码调整到DAL层后,几个项目之间的引用如下:

DAL引用Models

BLL引用Models、DAL

Web引用BLL

关于接口的问题,在BLL层的业务逻辑类(P318 AuthorsComponent.cs)里,定义了类继承自IComparer<T>的类AuthorComparer,用于对两个Author对象排序,然后在使用DataSet的Sort()方法第三个重载,对整个ds排序

关于接口的作用,记录一下:

2007-06-03 一个学习接口的例子:http://www.nnllok.cn/myBlog/archives/2007/3877.html

2008-05-03 不要把接口当妈妈,要什么都可以:http://www.nnllok.cn/myBlog/archives/2008/4579.html

2010-06-12 记录群里的讨论:

狼子() 13:43:54
接口的作用。。。

狼子() 13:45:13
接口只有属性和方法的声明,不带定义,接口就是一个规定,什么都不是,我老想为什么要有接口。。。

狼子() 13:45:50
现在明白了,如果,AuthorComparer类,不是继承IComparer<T>的,那Sort方法就不可以用这个类的对象做参数了

狼子() 13:46:30
就是一个规定,大家都这样子用,然后呢,大家都可以用
我现在好想知道sort方法是怎么写的了,我想知道他怎么用这个接口的。。。

狼子() 13:48:05
你们有没有这方面的例子可以给我看一下啊?

邵刘() 13:50:15
这个真没有了

邵刘() 13:50:18

邵刘() 13:50:26

狼子() 13:50:37

邵刘() 13:50:46
不知道百度能不能找到哎

狼子() 13:50:58
不知道,我还没找呢

狼子() 13:53:17
我老觉得接口不够公共类和dll好用,现在这样子看,好像,如果我们三个人一起写东西,然后呢,如果规定了前台文件的列表里只可以调用GetList()方法,就是,我们三个人可能要写的都不同,嗯,我的意思是,我们三个人都要用同一个方法,同参数,同返回值,这样子才可以给写前台的人随便调用,然后呢,嗯,我是说,我们这样子就需要一个接口,一个规定,对不对?

邵刘() 13:53:57
好像是的

狼子() 13:54:06
我们三个人写的GetList可以不同,就是,我们只要都继承同一个接口,要实现的方法就是相同的了,和前台调用的程序员没有关系了,类里面,怎么实现都可以,我们自己喜欢。。。

邵刘() 13:54:21
其实我以前也一直郁闷,为什么要搞个什么都不写的接口

狼子() 13:54:39
我郁闷了好多年啊

邵刘() 13:54:46
呵呵

小楼宝宝的涂鸦花花(Imitater)的博客起名称骨测字皖ICP备06000023号-17