
c_三层架构讲稿和学生选课管理系统.docx
19页>模块概述 2本模块工作任务 2本模块学习目标 2• 任务3-1:三层架构划分 2效果与描述 2相关知识与技能 33-1-1三层架构的划分原理 33-1-2 ORM (对象关系映射) 4任务的设计思路 5任务的实施 5举一反三 6任务3-2:数据访问层 6效果与描述 6相关知识与技能 73-2-1泛型集合的定义与使用 143-2-2数据访问层的设计思路 7任务的设计思路 错误!未定义书签任务的实施 8举一反三 10任务3-3:业务逻辑层的实现 10效果与描述 10相关知识与技能 113-3-1业务逻辑层的设计思路 11任务的设计思路 错误!未定义书签任务的实施 错误!未定义书签举一反三 18任务3-4:表示层的实现 错误!未定义书签效果与描述 错误!未定义书签相关知识与技能 错误!未定义书签3-4-1界面层的设计思路 错误!未定义书签任务的设计思路 错误!未定义书签任务的实施 错误!未定义书签举一反二 错误!未定义书签本模块小结 18本模块作业 19模块三基于3层架构的课程管理模块概述在上个模块:单层的课程管理中,已实现数据库的连接、命令的执行、不同数据集的应 用,并利用应用程序配置文件,和自定义的数据操作类,对程序进行了优化重构。
实现一个 管理信息系统所需要的技术,似乎已全了但是,如果应用程序的功能需求不是这么简单,而是有非常复杂的流程那么,如果按 照上个模块的做法,在最后的重构中设计了一些功能实现方法,并且在同一层调用,界面层 的代码就会很长而无序并且,一旦用户需求改变,则对这么长的代码进行重写,是不可行 的这种做法对于大型的软件是不能承受的因此,目前通用的做法是:将应用程序的实现分布在从底向高的三个层数据访问层实 现对数据库记录的操作,这对于特定DBMS是固定的,不需更改的;业务逻辑层利用数据访 问层实现业务逻辑,这层是关键,如果用户的业务需求改了,可以在这层中修改,因为这层 有很多独立的方法,而且,改某个功能不会影响到别的功能,这种改动就比较科学;界面层 调用业务逻辑层实现用户的功能,只要业务逻辑层有这个功能,就可以调用,界面层只需提 供输入输出和提示等这就是基于3层架构的应用程序体系结构,是目前最通用的架构模式本模块工作任务A任务3-1:三层架构划分> 任务3-2:数据访问层的实现A 任务3-3:业务逻辑层的实现A 任务3-4:表示层的实现本模块学习目标> 1、掌握三层架构的划分原理> 2、掌握各层的设计思路,和层之间的调用关系> 3、利用三层架构实现对课程管理模块的重构> 4、巩固OOP的基本概念和OOP的编程思路任务3-1:三层架构划分>效果与描述界面层业务逻辑层数据访问层图3. 1包含多个项目的3层架构解决方案本任务要求学生能够将原来的只有1个项目的课程管理模块,重构为标准的具有5个项 目的3层架构的模块,并进行恰当的初始化,仍能实现课程记录的添加、浏览功能。
在此过 程中理解3层架构的划分原理,各层的任务,层之间的调用关系本任务的业务流程:图3. 2单层转化为3层架构的业务流程 >相关知识与技能3-1-1三层架构的划分原理三层架构的划分如下图:11、 各层的任务数据访问层:使用ADO. NET中的数据操作类,为数据库中的每个表,设计1个数据访问 类类中实现:记录的插入、删除、单条记录的查询、记录集的查询、单条记录的有无判断 等基本的数据操作方法对于一般的管理信息软件,此层的设计是类似的,包含的方法也基 本相同此层的任务是:封装每个数据表的基本记录操作,为实现业务逻辑提供数据库访问 基础业务逻辑层:为用户的每个功能模块,设计1个业务逻辑类,此时,需要利用相关的数 据访问层类中,记录操作方法的特定集合,来实现每个逻辑功能界面层:根据用户的具体需求,为每个功能模块,部署输入控件、操作控件和输出控件, 并调用业务逻辑层中类的方法实现功能2、 层之间的调用关系数据访问层的类,直接访问数据库,实现基本记录操作业务逻辑层的类,调用相关的数据访问类,实现用户所需功能界面层:部署控件后,调用业务逻辑层的类,实现功能将应用程序的功能分层后,对于固定的DBMS,数据访问层基本可以不变,一旦用户的 需求改变,首先修改业务逻辑层,界面层稍做改动即可。
这种做法使程序的可复用性、可修 改性,都得到了很好的改善,大大提高了软件工程的效率3-1-2 ORM (对象关系映射)在图3.1中看到,除了界面层、业务逻辑层和数据访问层之外,还有2个项目其中, Common项目中一般放的是公用文件,如数据操作类DBHelper等,被数据访问层的类调用, 其必要性在上个模块已述Modal项目中存放的是实体类所谓的对象关系映射Object Relational Mapping,简称ORM,是为了解决面向对象的 类,与关系数据库的表之间,存在的不匹配的现象,通过使用描述对象和关系之间映射的元 数据,在程序中的类对象,与关系数据库的表之间建立持久的关系,用于在程序中描述数据 库表本质上就是将数据从一种形式转换到另外一种形式ORM是一个广义的概念,适应于关系数据库与应用程序之间的各类数据转换,目前有许 多自动转换工具可用,如codesmith等在本教材中,利用手工书写代码的形式,实现ORM如对于学生选课管理系统数据库中的课程表course,其设计视图如下:Course字段名称数摇类型文本CourseName文本CourseCredit数字图3. 4 Course表设计视图 可以这样设计类来描述它: public class Course{private string courseld; public string Courseld {get { return courseld; } set { courseld = value; } }private string courseName; public string CourseName {get { return courseName; } set { courseName = value; } }private int courseCredit; public int CourseCredit {get { return courseCredit; } set { courseCredit = value: }public Course () { }public Course(string courseld, string courseName, int courseCredit){this, courseld = courseld;this. courseName = courseName;this. courseCredit = courseCredit:}}将表中的每个字段抽取为类的字段(注意类型匹配),并封装成属性,设计构造函数, 来将表抽取为类。
这种类就称为实体类这个抽取过程称为对象关系映射0RM在Modal项目中,为数据库的每个表,都设计一个相应的实体类,这样,就相当于对每 个表实体,在.NET程序中,都可以通过类对象来应用在上面介绍的3层中,通常都会用 到实体类对象综上所述,这5个项目之间的关系是这样的:图3. 5三层架构中5个项目之间的关系图>任务的设计思路1、 在上个模块基于单层的课程管理的基础上,将原有的WINDOWS窗体应用程序的项目, 设置为界面层,改名为UI,界面层的控件部署不用改变,并设置为启动项目;2、 在解决方案中添加业务逻辑层项目BLL、数据访问层项目DAL、Common项目、Modal 项目,他们都是类库型的项目;3、 将DBHelepr类移到Common项目中;4、 在Modal项目中,为学生选课管理系统的每个表,设计对应的实体类5、 设置好引用关系后,运行,可实现课程记录的添加和浏览注意:此时,3层结构虽已架设好,运行也可实现课程管理的记录添加和浏览功能但 是运行的仍是界面层代码,其余层的代码尚未设计>任务的实施1、 在原来的版本中,用1个WINDOWS窗体应用项目就实现了课程管理,在3层架构体 系中,当然,这个项目就是界面层。
首先,把原有的项目改名为UI,右击此项目,改名即可然后,右击解决方案,选择“设置启动项目”,即可将界面层项目设置为启动项目2、 右击解决方案,分别生成4个新的项目,这些项目均是类库项目,按照惯例,数据 访问层项目起名为DAL,业务逻辑层项目起名为BLL,另外2个项目起名为Common和Modal03、 右击Common,选择“添加”里的“现有项”,将DBHelper类添加入此项目右击UI 下原有的DBHelper类文件,选择“从项目中排除”就实现了将DBHelepr类移到Common项目 中将命名空间改为BFCourse. Common,其中BFCourse为解决方案名以后每个项目中的每 个文件,都需要在前面加上解决方案名,这样,就都处于同一个命名空间BFCourse„4、 在Modal项目中,选择添加新建项,参考课程表的抽取方法,为学生选课管理系统 的每个表,设计对应的实体类同理,命名空间改为BFCourse. Modalo5^此时,界面层代码会显示DBHelper找不到,因为移到了 Common项目所以,必须 在界面层项目UI中添加对Common项目的引用然后,整个系统就可以运行了。
当然,虽然 形式是3层的,但实际运彳亍的是UI和Common中的代码A 举一反三1、 把选课系统数据库的另外3张表,学生表、选课表和用户表,都进行对象关系映射, 为其生成实体类2、 在包含5个项目的3层架构的系统中,为DAL、BLL项目添加类文件,只需添加空文 件,但命名方式按各层的功能需求设计,将所有需要的类文件添加齐全任务3-2:课程添加的3层实现A效果与描述效果图仍然如图2. 1所示,实现课程记录的添加但需要用3层的技术来实现首先,回顾一下,记录添加的业务流程,如图2. 14所示要判断输入的完整性;然后 判断输入的课程号主键在数据库中是否已有;若无,则插入记录到数据库中然后,根据业务需求,从底到高来设计每层单纯的判断记录有无、单纯的记录添加操 作,就可以放在数据访问层记录添加的逻辑功能:判断输入的课程号主键在数据库中是否 已有,若无,则插入记录到数据库中,则由业务逻辑层调用数据访问层的添加方法来实现; 最后,在界面层,其控件部署不用改变,只需判断文本框的输入完整性,然后调用业务逻辑 层的添加方法就可以了本任务的设计流程如下:图3. 6数据添加的3层设计流程A相关知识与技能3-2-1数据访问层的方法设计一般为系统数据库中的每个表设计一个数据访问类,实现基本的记录操作。
为了实现课 程记录的添加,目前,可在数据访问类包含如下方法:1、判断某主键的记录是否存在方法名:Exist形参:代表主键的变量返回值:bool 方法内代码设计:(1) 设计语句select * from表where主键名=形参(2) 利用using语句,调用DBHelper类,生成一个datareader对象(3) 利用HasRows属性判断此datareader对象是否有行,若有,返回真,否则 返回假应用场合。












