先记录两个连接:
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排序
关于接口的作用,记录一下:
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
呵呵