C#三层架构 简单实例分析要点.docx

上传人:b****2 文档编号:560709 上传时间:2022-10-11 格式:DOCX 页数:26 大小:282.81KB
下载 相关 举报
C#三层架构 简单实例分析要点.docx_第1页
第1页 / 共26页
C#三层架构 简单实例分析要点.docx_第2页
第2页 / 共26页
C#三层架构 简单实例分析要点.docx_第3页
第3页 / 共26页
C#三层架构 简单实例分析要点.docx_第4页
第4页 / 共26页
C#三层架构 简单实例分析要点.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

C#三层架构 简单实例分析要点.docx

《C#三层架构 简单实例分析要点.docx》由会员分享,可在线阅读,更多相关《C#三层架构 简单实例分析要点.docx(26页珍藏版)》请在冰豆网上搜索。

C#三层架构 简单实例分析要点.docx

C#三层架构简单实例分析要点

基于3层架构的课程管理系统

本模块工作任务

Ø任务3-1:

三层架构划分

Ø任务3-2:

数据访问层的实现

Ø任务3-3:

业务逻辑层的实现

Ø任务3-4:

表示层的实现

本模块学习目标

Ø1、掌握三层架构的划分原理

Ø2、掌握各层的设计思路,和层之间的调用关系

Ø3、利用三层架构实现对课程管理模块的重构

Ø4、巩固OOP的基本概念和OOP的编程思路

---------------------------------------------------------------------------------------------------------------------------------

任务3-1:

三层架构划分

Ø效果与描述

图3.1包含多个项目的3层架构解决方案

本任务要求学生能够将原来的只有1个项目的课程管理模块,重构为标准的具有5个项目的3层架构的模块,并进行恰当的初始化,仍能实现课程记录的添加、浏览功能。

在此过程中理解3层架构的划分原理,各层的任务,层之间的调用关系。

本任务的业务流程:

图3.2单层转化为3层架构的业务流程

Ø相关知识与技能

3-1-1三层架构的划分原理

三层架构的划分如下图:

图3.3三层架构原理图

1、各层的任务

数据访问层:

使用ADO.NET中的数据操作类,为数据库中的每个表,设计1个数据访问类。

类中实现:

记录的插入、删除、单条记录的查询、记录集的查询、单条记录的有无判断等基本的数据操作方法。

对于一般的管理信息软件,此层的设计是类似的,包含的方法也基本相同。

此层的任务是:

封装每个数据表的基本记录操作,为实现业务逻辑提供数据库访问基础。

业务逻辑层:

为用户的每个功能模块,设计1个业务逻辑类,此时,需要利用相关的数据访问层类中,记录操作方法的特定集合,来实现每个逻辑功能。

界面层:

根据用户的具体需求,为每个功能模块,部署输入控件、操作控件和输出控件,并调用业务逻辑层中类的方法实现功能。

2、层之间的调用关系

数据访问层的类,直接访问数据库,实现基本记录操作。

业务逻辑层的类,调用相关的数据访问类,实现用户所需功能。

界面层:

部署控件后,调用业务逻辑层的类,实现功能。

将应用程序的功能分层后,对于固定的DBMS,数据访问层基本可以不变,一旦用户的需求改变,首先修改业务逻辑层,界面层稍做改动即可。

这种做法使程序的可复用性、可修改性,都得到了很好的改善,大大提高了软件工程的效率。

3-1-2ORM(对象关系映射)

在图3.1中看到,除了界面层、业务逻辑层和数据访问层之外,还有2个项目。

其中,Common项目中一般放的是公用文件,如数据操作类DBHelper等,被数据访问层的类调用,其必要性在上个模块已述。

Modal项目中存放的是实体类。

所谓的对象关系映射ObjectRelationalMapping,简称ORM,是为了解决面向对象的类,与关系数据库的表之间,存在的不匹配的现象,通过使用描述对象和关系之间映射的元数据,在程序中的类对象,与关系数据库的表之间建立持久的关系,用于在程序中描述数据库表。

本质上就是将数据从一种形式转换到另外一种形式。

ORM是一个广义的概念,适应于关系数据库与应用程序之间的各类数据转换,目前有许多自动转换工具可用,如codesmith等。

在本教材中,利用手工书写代码的形式,实现ORM。

如对于学生选课管理系统数据库中的课程表course,其设计视图如下:

图3.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:

课程添加的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、添加课程

方法名:

AddXX

形参:

课程类对象

返回值:

void

方法内代码设计:

(1)调用CourseAccess类对象的Exist()方法,判断形参所表示的课程类对象是否存在,若存在方法返回;

(2)调用CourseAccess类对象的AddCourse()方法,添加课程,并利用返回值判断添加是否成功。

3-2-3界面层的设计

界面层的设计,首先需要根据用户的功能需求部署恰当控件,这些控件部署在第2模块已实现,不用改变。

然后,把功能实现代码放在恰当控件的恰当事件中,在这些代码中,需要调用业务逻辑层的方法实现。

课程添加时,界面上主要的功能如下:

1、按下添加按钮,实现课程记录的插入

(1)代码放在按钮的CLICK事件中;

(2)代码设计思路:

首先进行控件的输入正确性验证;其次利用控件的输入值,生成1个课程实体类对象;利用此对象,调用业务逻辑类对象的AddCourse()方法,插入记录;最后刷新浏览。

Ø任务的设计思路

1、在DAL

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1