c#三层架构讲稿和学生选课管理系统
更新时间:2023-04-30 01:34:01 阅读量: 综合文库 文档下载
--
?模块概述 2
本模块工作任务2?
本模块学习目标 (2)
●任务3-1:三层架构划分?2
?效果与描述 (2)
?相关知识与技能 (3)
3-1-1 三层架构的划分原理3?
3-1-2 ORM(对象关系映射)4?
?任务的设计思路 (5)
?任务的实施?5
??举一反三5?
任务3-2:数据访问层6?
??效果与描述?6
?相关知识与技能 (6)
3-2-1 泛型集合的定义与使用 (6)
3-2-2 数据访问层的设计思路 (8)
?任务的设计思路 (9)
?任务的实施9?
??举一反三 (11)
任务3-3:业务逻辑层的实现 ....................................................................................................... 11??效果与描述11?
?相关知识与技能........................................................................................................... 123-3-1 业务逻辑层的设计思路 (12)
??任务的设计思路?12
??任务的实施1?2
??举一反三 ......................................................................................................................... 14任务3-4:表示层的实现 .. (14)
?效果与描述14?
?相关知识与技能........................................................................................................... 143-4-1 界面层的设计思路 . (14)
??任务的设计思路 (15)
?任务的实施 (15)
??举一反三15?
本模块小结1?5
本模块作业................................................................................................................................... 17
--
--
模块三基于3层架构的课程管理
?模块概述
在上个模块:单层的课程管理中,已实现数据库的连接、命令的执行、不同数据集的应用,并利用应用程序配置文件,和自定义的数据操作类,对程序进行了优化重构。实现一个管理信息系统所需要的技术,似乎已全了。
?但是,如果应用程序的功能需求不是这么简单,而是有非常复杂的流程。那么,如果按照上个模块的做法,在最后的重构中设计了一些功能实现方法,并且在同一层调用,界面层的代码就会很长而无序。并且,一旦用户需求改变,则对这么长的代码进行重写,是不可行的。这种做法对于大型的软件是不能承受的。
因此,目前通用的做法是:将应用程序的实现分布在从底向高的三个层。数据访问层实现对数据库记录的操作,这对于特定DBMS是固定的,不需更改的;业务逻辑层利用数据访问层实现业务逻辑,这层是关键,如果用户的业务需求改了,可以在这层中修改,因为这层有很多独立的方法,而且,改某个功能不会影响到别的功能,这种改动就比较科学;界面层调用业务逻辑层实现用户的功能,只要业务逻辑层有这个功能,就可以调用,界面层只需提供输入输出和提示等。这就是基于3层架构的应用程序体系结构,是目前最通用的架构模式。
本模块工作任务
?任务3-1:三层架构划分
?任务3-2:数据访问层的实现
?任务3-3:业务逻辑层的实现
?任务3-4:表示层的实现
本模块学习目标
?1、掌握三层架构的划分原理
?2、掌握各层的设计思路,和层之间的调用关系
?3、利用三层架构实现对课程管理模块的重构
?4、巩固OOP的基本概念和OOP的编程思路
---------------------------------------------------------------------------------------------------------------------------------
任务3-1:三层架构划分
?效果与描述
界面层
业务逻辑层
数据访问层
图3.1包含多个项目的3层架构解决方案
--
--
-- 本任务要求学生能够将原来的只有1个项目的课程管理模块,重构为标准的具有5个项目的3层架构的模块,并进行恰当的初始化,仍能实现课程记录的添加、浏览功能。在此过程中理解3层架构的划分原理,各层的任务,层之间的调用关系。
本任务的业务流程: 将原项目改为
UI 层
新建BLL/ DAL/COMMON/MODL 项
目并初始化
初始化后仍能实现课程记录的浏览和添
加
图3.2 单层转化为3层架构的业务流程
? 相关知识与技能
3-1-1 三层架构的划分原理
三层架构的划分如下图:
图3.3 三层架构原理图
1、 各层的任务
数据访问层:使用AD O.N ET 中的数据操作类,为数据库中的每个表,设计1个数据访问类。类中实现:记录的插入、删除、单条记录的查询、记录集的查询、单条记录的有无判断等基本的数据操作方法。对于一般的管理信息软件,此层的设计是类似的,包含的方法也基本相同。此层的任务是:封装每个数据表的基本记录操作,为实现业务逻辑提供数据库访问基础。
业务逻辑层:为用户的每个功能模块,设计1个业务逻辑类,此时,需要利用相关的数据访问层类中,记录操作方法的特定集合,来实现每个逻辑功能。
界面层:根据用户的具体需求,为每个功能模块,部署输入控件、操作控件和输出控件,并调用业务逻辑层中类的方法实现功能。
2、 层之间的调用关系
数据访问层的类,直接访问数据库,实现基本记录操作。
业务逻辑层的类,调用相关的数据访问类,实现用户所需功能。
界面层:部署控件后,调用业务逻辑层的类,实现功能。
--
-- 将应用程序的功能分层后,对于固定的DBMS,数据访问层基本可以不变,一旦用户的需求改变,首先修改业务逻辑层,界面层稍做改动即可。这种做法使程序的可复用性、可修改性,都得到了很好的改善,大大提高了软件工程的效率。
3-1-2 ORM (对象关系映射)
在图3.1中看到,除了界面层、业务逻辑层和数据访问层之外,还有2个项目。其中,Co mmon 项目中一般放的是公用文件,如数据操作类DBH elpe r等,被数据访问层的类调用,其必要性在上个模块已述。Mod al 项目中存放的是实体类。
所谓的对象关系映射O bjec t Relat iona l M apping ,简称O RM,是为了解决面向对象的类,与关系数据库的表之间,存在的不匹配的现象,通过使用描述对象和关系之间映射的元数据,在程序中的类对象,与关系数据库的表之间建立持久的关系,用于在程序中描述数据库表。本质上就是将数据从一种形式转换到另外一种形式。
ORM 是一个广义的概念,适应于关系数据库与应用程序之间的各类数据转换,目前有许多自动转换工具可用,如c odes mit h 等。在本教材中,利用手工书写代码的形式,实现OR M。
如对于学生选课管理系统数据库中的课程表cou rse ,其设计视图如下
:
图3.4 Course 表设计视图
可以这样设计类来描述它:
p ub lic cl ass C ourse
{
private string course Id;
p ubli c string C ou rs eId
{
g et { ret ur n courseId ; }
set { cour seI d = value ; }
}
pr ivate strin g c ourse Name ;
publi c string CourseName
{
get { r etur n cou rseName; }
set { cou rs eName = va lue ; }
}
private int courseCredit;
publi c int Co ur seCredi t
{
get { r eturn courseCr ed it; }
set { cour seCre dit = val ue ; } }
--
public Course(){ }
public Course(string courseId,string courseNa me,int courseCredit)
{
this.courseId = courseId;
this.courseName =courseName;
this.courseCredit = courseCredit;
}
}
将表中的每个字段抽取为类的字段(注意类型匹配),并封装成属性,设计构造函数,来将表抽取为类。这种类就称为实体类。这个抽取过程称为对象关系映射ORM。
在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和Modal。
3、右击Common,选择“添加”里的“现有项”,将DBHelper类添加入此项目。右击UI下原有的DBHelper类文件,选择“从项目中排除”。就实现了将DBHelepr类移到Com mon项目中。将命名空间改为BFCourse.Common,其中BFCourse为解决方案名。以后每个项目中的每个文件,都需要在前面加上解决方案名,这样,就都处于同一个命名空间BFCourse。
4、在Modal项目中,选择添加新建项,参考课程表的抽取方法,为学生选课管理系统的每个表,设计对应的实体类。同理,命名空间改为BFCourse.Modal。
5、此时,界面层代码会显示DBHelper找不到,因为移到了Common项目。所以,必须在界面层项目UI中添加对Common项目的引用。然后,整个系统就可以运行了。当然,虽然形式是3层的,但实际运行的是UI和Common中的代码。
?举一反三
1、把选课系统数据库的另外3张表,学生表、选课表和用户表,都进行对象关系映射,为其生成实体类。
2、在包含5个项目的3层架构的系统中,为DAL、BLL项目添加类文件,只需添加空文件,但命名方式按各层的功能需求设计,将所有需要的类文件添加齐全。
---------------------------------------------------------------------------------------------------------------------------------
任务3-2:课程添加的3层实现
?效果与描述
效果图仍然如图2.1所示,实现课程记录的添加。但需要用3层的技术来实现。
首先,回顾一下,记录添加的业务流程,如图2.14所示。要判断输入的完整性;然后判断输入的课程号主键在数据库中是否已有;若无,则插入记录到数据库中。
然后,根据业务需求,从底到高来设计每层。单纯的判断记录有无、单纯的记录添加操作,就可以放在数据访问层。记录添加的逻辑功能:判断输入的课程号主键在数据库中是否已有,若无,则插入记录到数据库中,则由业务逻辑层调用数据访问层的添加方法来实现;最后,在界面层,其控件部署不用改变,只需判断文本框的输入完整性,然后调用业务逻辑层的添加方法就可以了。
?本任务的设计流程如下:
--
--
图3.6 数据添加的3层设计流程
?相关知识与技能
3-2-1数据访问层的方法设计
一般为系统数据库中的每个表设计一个数据访问类,实现基本的记录操作。为了实现课程记录的添加,目前,可在数据访问类包含如下方法:
1、判断某主键的记录是否存在
方法名:Exist
形参:代表主键的变量
返回值:bool
方法内代码设计:
(1)设计语句select * from 表where主键名=形参
(2)利用using语句,调用DBHelper类,生成一个datareader对象
(3)利用HasRows属性判断此datareader对象是否有行,若有,返回真,否则返回假。
应用场合:在插入记录前判断,若有则不用再插;在删除记录前判断,若有则不能删。
2、方法名:AddXX
形参:代表此表实体类的对象
返回值:int
方法内代码设计:
(1)设计语句insert
(2)调用DBHelper类,用ExeccuteNonQuery()方法执行此语句并返回。
应用场合:在表中添加一条记录,根据返回值是否大于0判断执行成功否。
3-2-2业务逻辑层的方法设计
一般为系统中的每个功能模块设计1个业务逻辑层的类,实现此模块的所有业务逻辑。在课程添加中,所需要的业务逻辑为课程添加。
首先,由于需要调用数据访问类CourseAccess,因此,在类内设计1个字段为此类对象:CourseAccess courseAccess =new CourseAccess();
其次,此类需要设计如下方法:
1、添加课程
方法名:AddXX
形参:课程类对象
返回值:void
方法内代码设计:
--
--
(1)调用CourseAccess类对象的Exist()方法,判断形参所表示的课程类对象是否存在,若存在方法返回;
(2)调用CourseAccess类对象的AddCourse()方法,添加课程,并利用返回值判断添加是否成功。
3-2-3界面层的设计
界面层的设计,首先需要根据用户的功能需求部署恰当控件,这些控件部署在第2模块已实现,不用改变。然后,把功能实现代码放在恰当控件的恰当事件中,在这些代码中,需要调用业务逻辑层的方法实现。课程添加时,界面上主要的功能如下:
1、按下添加按钮,实现课程记录的插入
(1)代码放在按钮的CLICK事件中;
(2)代码设计思路:首先进行控件的输入正确性验证;其次利用控件的输入值,生成1个课程实体类对象;利用此对象,调用业务逻辑类对象的AddCourse()方法,插入记录;最后刷新浏览。
?任务的设计思路
1、在DAL项目中新建针对课程表的数据访问类文件,将所需的2个方法设计在内。
2、在BLL项目中新建针对课程管理的业务逻辑类文件,并设计相关方法。
3、优化界面层代码,调用业务逻辑层类的方法,实现添加。
4、在DAL项目中,要用到DBHelper类和课程实体类Course,分别位于Common和Modal项目中,所以,必须在项目中加入对此2个项目的引用。同理,BLL项目中,要用到Cour seAccess类和课程实体类Course,分别位于DAL和Modal项目中,所以,必须在项目中加入对此2个项目的引用。UI项目中,要用到CourseBiz类和课程实体类Course,分别位于BLL和Modal项目中,所以,必须在项目中加入对此2个项目的引用。
?任务的实施
1、右击DAL项目,选择新建类文件,命名为:CourseAccess.cs。命名空间改为BF Course. DAL。右击项目,选择添加引用,选中项目里的Common和Modal,然后添加引用语句:usingBFCourse.Modal;usingBFCourse.Common。
2、CourseAccess类中判断某课程记录是否存在的方法:
///
///根据课号判断此课程是否存在
///</summary>
///
///
public bool Exist(string courseId)
{
stringstrSql = string.Format("select *from course where courseId='{0}'",courseId);
using(OleDbDataReader dr= DBHelper.GetReader(str Sql))
{
if (dr.HasRows)
return true;
else
returnfalse;
}
--
--
}
3、CourseAccess类中添加课程的方法,注意形参是课程对象
///<summary>
///利用课程对象添加课程
///
///
///<returns></returns>
public intAddCourse(Coursecourse)
{
stringstrSql =string.Format("insert into c ourse values('{0}','{1}','{2}')",course.CourseId,course.Co urseName,course.CourseCredit);
return DBHelper.ExecNonQuery(strSql);
}
4、右击BLL项目,选择新建类文件,命名为:CourseBiz.cs。命名空间改为BFCours
e.BLL。右击项目,选择添加引用,选中项目里的DAL和Modal,然后添加引用语句:using BFCourse.Modal;usingBFCourse.DAL。
5、CourseBiz类部分代码
public classCourseBiz
{
CourseAccess courseAccess =new CourseA
ccess();
/// ///判断逻辑,插入课程 ///</summary> /// publicvoid AddCourse(Coursecourse) { if(courseAccess.Exist(course.CourseId)) { MessageBox.Show("此课程号已存在,请重新输入"); return; } if (courseAccess.AddCourse(course) >0) MessageBox.Show("添加成功"); else MessageBox.Show("添加失败"); } } 6、右击UI项目,命名空间改为BFCourse. UI。右击项目,选择添加引用,选中项目里的BLL和Modal,然后添加引用语句:usingBFCourse.Modal;using BFCourse.BLL。 7、界面层重构的部分代码 -- -- privatevoid buttonAdd_Click(object sender, EventArgse) { if (textBox1.Text == String.Empty) { MessageBox.Show("请输入课程编号"); return; } if(textBox2.Text== String.Empty) { MessageBox.Show("请输入课程名称"); return; } if (textBox3.Text == String.Empty) { MessageBox.Show("请输入课程学分"); return; } string courId = textBox1.Text.Trim(); string courName= textBox2.Text.Trim(); int courCredit = Convert.ToInt32(textBox3.Text.Trim()); Course course = new Course(courId, courName,cour Credit); ??CourseBizcb= newCourseBiz(); cb.AddCourse(course); } 此时运行系统,记录添加的部分就是由这3层实现的,界面层按下“添加”按钮后,调用BLL层的voidAddCourse(Course course)方法,此方法又调用DAL层的bool Exis t(stringcourseId)和int AddCourse(Course course)方法,它们再调用DBHelper中的具体数据记录操作方法。是一个标准的3层架构调用机制。 总结:3层架构设计时,根据功能需求,从下而上设计,实际运行时,从上而下调用。 图3.7课程添加的3层调用流程 ?举一反三 1、 -- -- -- --------------------------------------------------------------------------------------------------------------------------------- 任务3-3:课程删除的3层实现 ? 效果与描述 图3.8 添加课程删除功能后的课程管理界面 效果图如图 所示,为了实现课程记录的删除,需要按主键删除,所以添加了课程号的文本框和删除按钮。 用3层的技术来实现。首先,也需要理顺记录删除的业务流程,如下图 所示。 在文本框中输入主键字段 是空的文本框吗 是 返回重新输入否 课程号文本框的值 在数据库中存在否 否是 删除该主键的课程记录并刷新浏览 图3.9 课程删除的业务流程 要判断输入的完整性;然后判断输入的课程号主键在数据库中是否已有;若有,则删除该主键的记录。 然后,根据业务需求,从底到高来设计每层。单纯的判断记录有无,已在上个任务实现;单纯的记录删除操作,就可以添加在课程表的数据访问层类。记录删除的逻辑功能:判断输入的课程号主键在数据库中是否已有,若有,则删除记录,由业务逻辑层添加调用数据访问层的删除方法来实现;最后,在界面层,只需判断文本框的输入完整性,然后调用业务逻辑层的删除方法。 -- 本任务的设计流程如记录添加的设计流程,不再赘述。 ?相关知识与技能 3-3-1 数据访问层的方法设计 在上个任务的CourseAccess类中,为了实现删除,需要添加的方法有: 1、删除记录 方法名:DelXX 形参:代表主键的变量课程号 返回值:int 方法内代码设计: (1)设计语句delete (2)调用DBHelper类,用ExeccuteNonQuery()方法执行此语句并返回 应用场合:在表中删除一条记录,根据返回值是否大于0判断执行成功否。 3-3-2业务逻辑层的方法设计 在上个任务的CourseBiz类中,为了实现删除,需要添加的方法有: 1、删除课程 方法名:DelXX 形参:代表主键的变量课程号 返回值:void 方法内代码设计: (1)调用CourseAccess类对象的Exist()方法,判断形参的课程类对象是否存在,若不存在方法返回; (2)调用CourseAccess类对象的DelCourse()方法,删除课程,并利用返回值判断添加是否成功。 3-3-3 界面层的设计 界面层的设计,部署恰当控件后,把功能实现代码放在恰当控件的恰当事件中。课程删除时,界面上主要的功能如下: 1、按下删除按钮,实现课程记录的删除 (1)代码放在按钮的CLICK事件中; (2)代码设计思路:首先进行控件的输入正确性验证;将控件的值放在某变量中;利用此变量作为实参,调用业务逻辑类对象的DelCourse()方法,删除记录;最后刷新浏览。 ?任务的设计思路 1、在DAL项目中CourseAccess类,添加删除课程的方法。 2、在BLL项目中CourseBiz类,添加课程删除相关方法。 3、优化界面层代码,调用业务逻辑层类的方法,实现删除。 ?任务的实施 1、在CourseAccess类中,添加如下方法: 删除课程,注意形参是课程号 ///<summary> ///根据课程号删除课程 ///</summary> ///<param name="courseId"></param> /// publicint DelCourse(stringcourseId) --
正在阅读:
c#三层架构讲稿和学生选课管理系统04-30
沪教版六年级数学第二章 分 数测试卷10-21
2017年入党积极分子自传范文2000字03-25
LTE随机接入问题研究09-25
科技进步高三话题作文600字优秀9篇03-23
《概率论公式大全》Word文档04-09
520节日祝福语02-24
天地伟业矩阵切换控制器硬件说明书05-01
光盘刻录完全教程12-07
大地测量学复习资料(精简版)09-15
- 《江苏省环境水质(地表水)自动监测预警系统运行管理办法(试行)》
- 安乐死合法化辩论赛立论稿(浙大新生赛)
- 公共科目模拟试卷公务员考试资料
- 我国固定资产投资FAI对GDP的影响
- 大学生创新创业训练计划项目申请书大创项目申报表
- 完美版—单片机控制步进电机
- 2013资阳中考化学试题
- 18.两位数减一位数退位(397道)
- 工程量计算规则
- 二年级操行评语(下)
- 第3章 流程控制语句
- 浅基桥墩加固技术
- 课题研究的主要方法
- 5100软件说明书 - 图文
- 车间技术员年终总结
- 关于印发《中铁建工集团开展项目管理实验室活动方案》的通知
- 经典诵读结题报告
- 地下水动力学习题答案
- 2018年全国各地高考数学模拟试题平面解析几何试题汇编(含答案解
- 街道办事处主任2018年度述职述廉报告
- c#
- 讲稿
- 选课
- 架构
- 管理系统
- 学生
- 2017年苏州大学教育学院、教育科学研究院633教育学专业基础综合之简明中国教育史考研导师圈点必考题汇编
- 小学四年级关于环保的作文400字
- 大学生职业规划书范文-大学生职业规划模板
- 工商管理大学生入党申请书1500字
- 中学校本课程实施方案
- 图文解说DG灾备环境搭建步骤
- 电力设备设施安全标志管理规定标准范本
- (水利水电)部分常用岩土物理力学参数经验数值
- 原创高中生基础素养评价高中生操行评语
- 安全隐患整改管理制度
- 部编版-语文-二年级上册-二年级上册语文教案《植物妈妈有办法》
- 高考文科综合地理部分分类汇编天气气候及变化
- 军神第二课时教学设计
- 三年级上册第一单元作文《我们的课余生活》范例文集锦
- 2018年福建师范大学文学院627外国文学史考研强化五套模拟题
- 五年级作文:看马戏团表演作文500字
- 2020年年度工作总结汇总
- 教职工年度考核实施办法(2011高职86号)
- 平安创建工作计划范文
- 人教版九年级化学导学案(全册)