C#三层架构 简单实例分析Word下载.docx
- 文档编号:19941472
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:24
- 大小:303.48KB
C#三层架构 简单实例分析Word下载.docx
《C#三层架构 简单实例分析Word下载.docx》由会员分享,可在线阅读,更多相关《C#三层架构 简单实例分析Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
此层的任务是:
封装每个数据表的基本记录操作,为实现业务逻辑提供数据库访问基础。
业务逻辑层:
为用户的每个功能模块,设计1个业务逻辑类,此时,需要利用相关的数据访问层类中,记录操作方法的特定集合,来实现每个逻辑功能.
界面层:
根据用户的具体需求,为每个功能模块,部署输入控件、操作控件和输出控件,并调用业务逻辑层中类的方法实现功能。
2、层之间的调用关系
数据访问层的类,直接访问数据库,实现基本记录操作。
业务逻辑层的类,调用相关的数据访问类,实现用户所需功能。
界面层:
部署控件后,调用业务逻辑层的类,实现功能。
将应用程序的功能分层后,对于固定的DBMS,数据访问层基本可以不变,一旦用户的需求改变,首先修改业务逻辑层,界面层稍做改动即可。
这种做法使程序的可复用性、可修改性,都得到了很好的改善,大大提高了软件工程的效率。
3-1—2ORM(对象关系映射)
在图3.1中看到,除了界面层、业务逻辑层和数据访问层之外,还有2个项目。
其中,Common项目中一般放的是公用文件,如数据操作类DBHelper等,被数据访问层的类调用,其必要性在上个模块已述。
Modal项目中存放的是实体类。
所谓的对象关系映射ObjectRelationalMapping,简称ORM,是为了解决面向对象的类,与关系数据库的表之间,存在的不匹配的现象,通过使用描述对象和关系之间映射的元数据,在程序中的类对象,与关系数据库的表之间建立持久的关系,用于在程序中描述数据库表.本质上就是将数据从一种形式转换到另外一种形式.
ORM是一个广义的概念,适应于关系数据库与应用程序之间的各类数据转换,目前有许多自动转换工具可用,如codesmith等.在本教材中,利用手工书写代码的形式,实现ORM.
如对于学生选课管理系统数据库中的课程表course,其设计视图如下:
4Course表设计视图
可以这样设计类来描述它:
publicclassCourse
{
privatestringcourseId;
publicstringCourseId
{
get{returncourseId;
}
set{courseId=value;
}
privatestringcourseName;
publicstringCourseName
get{returncourseName;
set{courseName=value;
privateintcourseCredit;
publicintCourseCredit
get{returncourseCredit;
set{courseCredit=value;
publicCourse(){}
publicCourse(stringcourseId,stringcourseName,intcourseCredit)
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类移到Common项目中。
将命名空间改为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。
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个字段为此类对象:
CourseAccesscourseAccess=newCourseAccess();
其次,此类需要设计如下方法:
1、添加课程
课程类对象
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项目中,要用到CourseAccess类和课程实体类Course,分别位于DAL和Modal项目中,所以,必须在项目中加入对此2个项目的引用.UI项目中,要用到CourseBiz类和课程实体类Course,分别位于BLL和Modal项目中,所以,必须在项目中加入对此2个项目的引用。
1、右击DAL项目,选择新建类文件,命名为:
CourseAccess。
cs。
命名空间改为BFCourse。
DAL。
右击项目,选择添加引用,选中项目里的Common和Modal,然后添加引用语句:
usingBFCourse。
Modal;
usingBFCourse.Common。
2、CourseAccess类中判断某课程记录是否存在的方法:
///<
summary>
///根据课号判断此课程是否存在
///〈/summary〉
///<
paramname=”courseId"
〉<
/param>
returns〉〈/returns>
publicboolExist(stringcourseId)
stringstrSql=string。
Format("
select*fromcoursewherecourseId='
{0}’"
courseId);
using(OleDbDataReaderdr=DBHelper。
GetReader(strSql))
if(dr。
HasRows)
returntrue;
else
returnfalse;
3、CourseAccess类中添加课程的方法,注意形参是课程对象
///〈summary〉
///利用课程对象添加课程
///〈/summary>
///〈paramname=”course"
>
〈/param>
///〈returns〉〈/returns>
publicintAddCourse(Coursecourse)
stringstrSql=string.Format("
insertintocoursevalues('
{0}'
’{1}'
'
{2}'
)"
,course.CourseId,course.CourseName,course.CourseCredit);
returnDBHelper。
ExecNonQuery(strSql);
4、右击BLL项目,选择新建类文件,命名为:
CourseBiz.cs。
BLL。
右击项目,选择添加引用,选中项目里的DAL和Modal,然后添加引用语句:
usingBFCourse.Modal;
DAL。
5、CourseBiz类部分代码
publicclassCourseBiz
CourseAccesscourseAccess=newCourseAccess();
///〈summary〉
///判断逻辑,插入课程
/summary〉
paramname="
course"
publicvoidAddCourse(Coursecourse)
if(courseAccess.Exist(course.CourseId))
MessageBox.Show("
此课程号已存在,请重新输入"
);
return;
if(courseAccess.AddCourse(course)>
0)
添加成功"
);
MessageBox。
Show("
添加失败”);
}
6、右击UI项目,命名空间改为BFCourse.UI。
右击项目,选择添加引用,选中项目里的BLL和Modal,然后添加引用语句:
Modal;
usingBFCourse.BLL。
7、界面层重构的部分代码
privatevoidbuttonAdd_Click(objectsender,EventArgse)
if(textBox1。
Text==String。
Empty)
Show(”请输入课程编号"
if(textBox2。
Text==String.Empty)
请输入课程名称”);
if(textBox3。
Show(”请输入课程学分"
return;
stringcourId=textBox1。
Text。
Trim();
stringcourName=textBox2.Text。
Trim();
intcourCredit=Convert。
ToInt32(textBox3.Text。
Trim());
Coursecourse=newCourse(courId,courName,courCredit);
CourseBizcb=newCourseBiz();
cb。
AddCourse(course);
此时运行系统,记录添加的部分就是由这3层实现的,界面层按下“添加”按钮后,调用BLL层的voidAddCourse(Coursecourse)方法,此方法又调用DAL层的boolExist(stringcourseId)和intAddCourse(Coursecourse)方法,它们再调用DBHelper中的具体数据记录操作方法。
是一个标准的3层架构调用机制。
总结:
3层架构设计时,根据功能需求,从下而上设计,实际运行时,从上而下调用.
7课程添加的3层调用流程
1、
—-———-—--——-—-—---—-—--—-—--——---——------—-—--————--————-——---—--——-——-—-—--—-—-———-—--—--—-———————--———--——-——--—-—-———-——-——---
课程删除的3层实现
8添加课程删除功能后的课程管理界面
效果图如图所示,为了实现课程记录的删除,需要按主键删除,所以添加了课程号的文本框和删除按钮。
用3层的技术来实现。
首先,也需要理顺记录删除的业务流程,如下图所示.
9课程删除的业务流程
若有,则删除该主键的记录。
然后,根据业务需求,从底到高来设计每层。
单纯的判断记录有无,已在上个任务实现;
单纯的记录删除操作,就可以添加在课程表的数据访问层类.记录删除的逻辑功能:
判断输入的课程号主键在数据库中是否已有,若有,则删除记录,由业务逻辑层添加调用数据访问层的删除方法来实现;
最后,在界面层,只需判断文本框的输入完整性,然后调用业务逻辑层的删除方法。
本任务的设计流程如记录添加的设计流程,不再赘述。
3-3-1数据访问层的方法设计
在上个任务的CourseAccess类中,为了实现删除,需要添加的方法有:
1、删除记录
方法名:
DelXX
代表主键的变量课程号
返回值:
(1)设计语句delete
(2)调用DBHelper类,用ExeccuteNonQuery()方法执行此语句并返回
在表中删除一条记录,根据返回值是否大于0判断执行成功否。
3-3—2业务逻辑层的方法设计
在上个任务的CourseBiz类中,为了实现删除,需要添加的方法有:
1、删除课程
(1)调用CourseAccess类对象的Exist()方法,判断形参的课程类对象是否存在,若不存在方法返回;
(2)调用CourseAccess类对象的DelCourse()方法,删除课程,并利用返回值判断添加是否成功。
3-3—3界面层的设计
界面层的设计,部署恰当控件后,把功能实现代码放在恰当控件的恰当事件中。
课程删除时,界面上主要的功能如下:
1、按下删除按钮,实现课程记录的删除
(1)代码放在按钮的CLICK事件中;
(2)代码设计思路:
将控件的值放在某变量中;
利用此变量作为实参,调用业务逻辑类对象的DelCourse()方法,删除记录;
1、在DAL项目中CourseAccess类,添加删除课程的方法.
2、在BLL项目中CourseBiz类,添加课程删除相关方法.
3、优化界面层代码,调用业务逻辑层类的方法,实现删除。
1、在CourseAccess类中,添加如下方法:
删除课程,注意形参是课程号
///〈summary>
///根据课程号删除课程
courseId”>
<
/param〉
///〈returns〉<
/returns>
publicintDelCourse(stringcourseId)
Format(”deletefromcoursewherecourseId=’{0}’”,courseId);
returnDBHelper.ExecNonQuery(strSql);
2、在CourseBiz类中,添加如下方法:
summary〉
///判断逻辑,删¦
除课程
//<
publicvoidDelCourse(stringcourseId)
if(!
courseAccess.Exist(courseId))
MessageBox.Show(”此课程号不存在,请重新输入”);
if(courseAccess.DelCourse(courseId)>
添加成功”);
Show(”添加失败”);
3、界面层重构的代码如下:
privatevoidbuttonDel_Click(objectsender,EventArgse)
if(textBox4。
请输入课程编号”);
stringcourId=textBox4。
Text.Trim();
CourseBizcb=newCourseBiz();
DelCourse(courId);
此时运行系统,记录删除的部分就是由这3层实现的,界面层按下“删除"
按钮后,调用BLL层
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C#三层架构 简单实例分析 C# 三层 架构 简单 实例 分析