ASPNET三层架构.docx

上传人:b****3 文档编号:10548027 上传时间:2023-05-26 格式:DOCX 页数:16 大小:386.02KB
下载 相关 举报
ASPNET三层架构.docx_第1页
第1页 / 共16页
ASPNET三层架构.docx_第2页
第2页 / 共16页
ASPNET三层架构.docx_第3页
第3页 / 共16页
ASPNET三层架构.docx_第4页
第4页 / 共16页
ASPNET三层架构.docx_第5页
第5页 / 共16页
ASPNET三层架构.docx_第6页
第6页 / 共16页
ASPNET三层架构.docx_第7页
第7页 / 共16页
ASPNET三层架构.docx_第8页
第8页 / 共16页
ASPNET三层架构.docx_第9页
第9页 / 共16页
ASPNET三层架构.docx_第10页
第10页 / 共16页
ASPNET三层架构.docx_第11页
第11页 / 共16页
ASPNET三层架构.docx_第12页
第12页 / 共16页
ASPNET三层架构.docx_第13页
第13页 / 共16页
ASPNET三层架构.docx_第14页
第14页 / 共16页
ASPNET三层架构.docx_第15页
第15页 / 共16页
ASPNET三层架构.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ASPNET三层架构.docx

《ASPNET三层架构.docx》由会员分享,可在线阅读,更多相关《ASPNET三层架构.docx(16页珍藏版)》请在冰点文库上搜索。

ASPNET三层架构.docx

ASPNET三层架构

ASP.NET三层架构应用总结

(一)

[2009-6-216:

22:

00|By:

backbird]

 

前言:

与ASP相比ASP.NET在Web应用开发上无疑更容易,更有效率。

Web开发大部分还是围绕着数据操作,建立数据库存储数据,编写代码访问和修改数据,设计界面采集和呈现数据。

走过A学习入门阶段后,真正开始着手开发一个Web项目时,才发现错综复杂的数据与关联根本就不是SqlDataSource和AccessDataSource数据源控件能简单解决的,而恰恰是被忽视了的一个ObjectDataSource数据源控件才是真正踏入开发门槛的关键,由此也对三层架构模式有了初步体验。

一.ASP.NET三层架构介绍

设计模式中的分层架构(可以参考一下J2EE中MVC模式)实现了各司其职,互不干涉,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。

这样就能更好的实现开发中的分工,有利于组件的重用。

所以这些年关于模式的研究有很多成果,应用也很广泛。

一个好的模式在程序开发和后期维护中作用重大。

ASP.NET三层架构自底向上分为:

数据访问层(DAL),业务逻辑层(BLL)和表示层(PL)。

数据访问层(DAL):

使用了一个强类型的DataSet作为数据访问层,只是单纯的对数据进行增,删,改,查询和判断存在等等较通用的数据访问方法(由SQL语句来提供),不应该有“事务”存在。

业务逻辑层(BLL):

业务逻辑层是在数据访问层和表示层之间进行数据交换的桥梁,按业务需求调用数据访问层中的方法组合,集合了各种业务规则到一个BLL中,例如通过条件进行判断的数据操作或“事务”处理。

BLL都是以类库(ClassLibrary)的形式来实现的。

表示层(PL):

表示层是为客户提供用于交互的应用服务图形界面,帮助用户理解和高效地定位应用服务,呈现业务逻辑层中传递的数据,用ASP.NET页面来实现。

二.三层架构应用实现

随着ASP.NET的不断升级,可以很方便的使用ASP.NET来构建B/S三层架构的应用程序,下面以“教师业务信息管理系统”项目中的部分例子来演示如何使用ASP.NET2.0和SQLServer2005数据库来构建一个三层架构的应用程序。

1.创建数据库

打开SQLServer2005,新建一个数据库“TeacherDb”,建立如下所示结构的两个表“PersonInfo”和“JobInfo”。

两表以PersonIDNumber作为关联字段,存储18位身份证号码。

表名:

PersonInfo

基本信息表

字段名

类型

说明

备注

ID

int

主键,自增

UserID

uniqueidentifier

登录帐户ID

TrueName

nvarchar(20)

姓名

PersonIDNumber

nvarchar(18)

身份证

Sex

nvarchar

(1)

性别

“男”或“女”

BirthDate

datetime

出生日期

Nation

nvarchar(10)

民族

NativePlace

nvarchar(50)

籍贯

Polity

nvarchar(10)

政治面貌

JoinPolityTime

datetime

入党时间

PersonImageUrl

nvarchar(250)

相片地址

允许NULL

Telephone

nvarchar(50)

联系电话

MobiePhone

nvarchar(50)

手机号码

Email

nvarchar(50)

Email

表名:

JobInfo

职业信息表

字段名

类型

说明

备注

ID

int

主键,自增

PersonIDNumber

nvarchar(18)

身份证号码

Post1

nvarchar(20)

职务

Post2

nvarchar(20)

职务2

第二职务

JoinTime

datetime

参加工作时间

CountryWorkedTime

int

农村年限

MasteSubject

nvarchar(20)

学科

SecondSubject

nvarchar(20)

兼职学科

SchoolPhase

nvarchar(10)

学段

MotherClassTime

int

班主任年限

SchoolID

int

所在学校代码

InPosition

real

是否在职

2.创建数据访问层

在开始创建数据访问层(DAL)之前,首先需要创建一个网站,配置好数据库链接。

第一步:

创建一个Web项目,配置数据库连接

打开VisualStudio2005(以下简称VS2005)集成开发环境,首先创建一个C#语言的ASP.NET网站,并将其命名为WebSite,设置位置(Location)列表的选项为文件系统(FileSystem),然后选这一个放置这个网站的文件夹,然后选择编程语言为C#。

VisualStudio会为你生成一个新的网站,同时生成一个名为Default.aspx的网页,和一个App_Data文件夹。

第二步:

创建数据访问层,配置数据库连接

接下来创建数据访问层,添加一个强类型的DataSet。

在解决方案管理器里的项目节点上按右鼠标,选择“添加新项”,在模板列单里选择“数据集”,将其命名为DataSet1.xsd。

接下来会出现“TableAdpater”配置向导的窗口,选择数据库服务器,设置好各项参数,并按照提示逐步完成。

需要注意:

1.指定连接的数据库字符串,并选择将连接字符串保存到web.config文件中去。

2.命令类型选择“使用SQL语句”,通过“高级选项”选择“生成Insert、Update和Delete语句”,通过“查询生成器”生成要装载数据的“Select语句”。

并为方法命名。

SELECTID,UserID,TrueName,PersonIDNumber,Sex,BirthDate,Nation,NativePlace,

Polity,JoinPolityTime,PersonImageUrl,Telephone,MobiePhone,Email

FROMEM_P_PersonInfo

针对项目需求对数据库中各表查询操作分别建立各种方法,完成后的可能如下图。

跟底层数据源相关的所有编码,比如建立到数据库的连接,发出SELECT,INSERT,UPDATE和DELETE命令等的编码,都应该放置在DAL中。

表现层不应该包含对这些数据访问编码的任何引用,而应该调用DAL中的编码处理所有的数据访问请求。

数据访问层包含访问底层数据库数据的方法。

至此,清晰构建出数据访问层,之后可在“业务逻辑层”和“表示层”通过调用自动生成的TableAdpater及相关类来操作数据。

由于“数据集”是强类型,对于数据库中的NULL数据需要使用方法来判断,这些内容在后续内容中再详细描述。

3.创建业务逻辑层

数据访问层(DAL)将数据访问的细节从表示层中分离出来了,可它却不能处理任何的业务规则。

比如判断数据的有效性。

这些工作将由业务逻辑层(简称BLL)来承担,在以下应用程序中,将BLL实现为App_Code文件夹中的一系列的类。

每一个BLL类都对应DAL中的一个TableAdapter,它们都从各自的TableAdapter中得到读取、插入、修改以及删除等方法以应用合适的业务规则。

第一步:

创建BLL类

在App_Code文件夹中创建2个类文件。

在解决方案浏览器(SolutionExplorer)中右键点击App_Code文件夹,并选择新建项目(NewItem),然后在弹出的对话框中选择“类”模板(Classtemplate)就可以创建新的类文件了。

将这2个文件分别命名为UserBLL以及JobBLL。

第二步:

通过BLL类访问类型化数据集

为UserBLL和JobBLL类分别添加如下方法:

(1)UserBLL.css

●          updateUser(stringUserName,StringPersonIDNumber,intSchoolID,stringPassword,stringSex,stringTrueName,boolInPosition)

●          updateUser(StringPersonIDNumber,stringTrueName,stringBirthDate,stringNation,stringNativePlace,stringPolity,stringJoinPolityTime,stringTelephone,stringMobiePhone,stringEmail)

●          getPersons(intSchoolID,stringTrueName)

●          getPersonByPID(stringPersonIDNumber)

●          deleteUser(stringUserName,StringPersonIDNumber,int?

SchoolID)

●          addUser(stringUserName,StringPersonIDNumber,intSchoolID,stringPassword,stringSex,stringTrueName,boolInPosition)

(2)JobBLL.css

●          getPersonJob(stringPersonIDNumber)

●          updateUser(StringPersonIDNumber,stringPost1,stringPost2,stringJoinTime,int?

CountryWorkedTime,stringMasteSubject,stringSecondSubject,stringSchoolPhase,int?

MotherClassTime)

以下为JobBLL.css的代码(UserBLL.css的代码太长,不列出)

usingSystem;

usingSystem.Data;

usingSystem.Configuration;

usingSystem.Web;

usingSystem.Web.Security;

usingSystem.Web.UI;

usingSystem.Web.UI.WebControls;

usingSystem.Web.UI.WebControls.WebParts;

usingSystem.Web.UI.HtmlControls;

usingTeacherTableAdapters;

///

///JobBLL的摘要说明

///

[System.ComponentModel.DataObject]

publicclassJobBLL

{

privateJobInfoTableAdapter_JobAdapter=null;

publicJobBLL()

{

//

//TODO:

在此处添加构造函数逻辑

//

}

protectedJobInfoTableAdapterAdapter

{

get

{

if(_JobAdapter==null)

_JobAdapter=newJobInfoTableAdapter();

return_JobAdapter;

}

}

//select

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,false)]

publicTeacher.JobInfoDataTablegetPersonJob(stringPersonIDNumber)

{

returnAdapter.GetPersonJobByPID(PersonIDNumber);

}

//update

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update,false)]

publicboolupdateUser(StringPersonIDNumber,stringPost1,stringPost2,stringJoinTime,int?

CountryWorkedTime,stringMasteSubject,stringSecondSubject,stringSchoolPhase,int?

MotherClassTime)

{

if(string.IsNullOrEmpty(PersonIDNumber))

{

returnfalse;

}

try

{

Teacher.JobInfoDataTablePersonJob=Adapter.GetPersonJobByPID(PersonIDNumber);

Teacher.JobInfoRowPersonJobPID;

if(PersonJob.Count==1)

{

PersonJobPID=PersonJob[0];

}

else

{

returnfalse;

}

if(!

string.IsNullOrEmpty(Post1))

{

PersonJobPID.Post1=Post1;

}

else

{

PersonJobPID.SetPost1Null();

}

if(!

string.IsNullOrEmpty(Post2))

{

PersonJobPID.Post2=Post2;

}

else

{

PersonJobPID.SetPost2Null();

}

if(!

string.IsNullOrEmpty(MasteSubject))

{

PersonJobPID.MasteSubject=MasteSubject;

}

else

{

PersonJobPID.SetMasteSubjectNull();

}

if(!

string.IsNullOrEmpty(SecondSubject))

{

PersonJobPID.SecondSubject=SecondSubject;

}

else

{

PersonJobPID.SetSecondSubjectNull();

}

if(!

string.IsNullOrEmpty(SchoolPhase))

{

PersonJobPID.SchoolPhase=SchoolPhase;

}

else

{

PersonJobPID.SetSchoolPhaseNull();

}

if(!

(CountryWorkedTime==null))

{

PersonJobPID.CountryWorkedTime=CountryWorkedTime.Value;

}

else

{

PersonJobPID.SetCountryWorkedTimeNull();

}

if(!

(MotherClassTime==null))

{

PersonJobPID.MotherClassTime=MotherClassTime.Value;

}

else

{

PersonJobPID.SetMotherClassTimeNull();

}

if(!

string.IsNullOrEmpty(JoinTime))

{

PersonJobPID.JoinTime=DateTime.Parse(JoinTime);

}

else

{

PersonJobPID.SetJoinTimeNull();

}

introwAffect1=Adapter.Update(PersonJobPID);

return(rowAffect1==1);

}

catch(System.Configuration.Provider.ProviderExceptione)

{

returnfalse;

}

}

说明:

(1)usingTeacherTableAdapters;引用DAL层命名空间,自动生成,必须。

否则无法使用类。

(2)JobInfoTableAdapter类,对应DAL中的TableAdapter适配器JobInfo,通过这个类来调用增、删及改等数据操作。

(3)使用JobInfoDataTablePersonJob来装载查询返回的数据,是DataSet中的强类型数据表,结构和数据类型由数据库定义。

使用JobInfoRowPersonJobPID来载入表中的某一行。

行字段访问用如下形式:

Row变量.字段名(如PersonJobPID.Post1)。

Teacher.JobInfoDataTablePersonJob=Adapter.GetPersonJobByPID(PersonIDNumber);

Teacher.JobInfoRowPersonJobPID=PersonJob[0];

(4)数据库中某些表字段在设计时可能被允许空值(null),强类型DataTable中对字段的判空与赋空值不能采用以下形式:

●          !

string.IsNullOrEmpty(PersonJobPID.Post1)

●          PersonJobPID.Post1==null;

●          PersonJobPID.Post1=null;

正确的做法是采用行类型变量(Teacher.JobInfoRowPersonJobPID)为每个字段生成的“空值方法”操作:

●          voidPersonJobPID.SetPost1Null();

●          boolPersonJobPID.IsPost1Null()

(5)JobInfoDataTable或JobInfoRow中数据存储在内存中,修改后的数据要反映到数据库中采用适配器方法Update().

introwAffect1=Adapter.Update(PersonJobPID);

至此业务逻辑层构建完成。

4.表示层-使用ObjectDataSource展现数据

在完成应用程序架构后,我们可以实现多种报表展现。

ASP.NET2.0的数据源控件提供了一种新的方式,使用这些控件可以轻松的从创建的业务逻辑层中进行数据绑定,甚至不需要手写一行的代码。

 

ASP.NET2.0提供了五种内置的数据源控件:

SqlDataSource、AccessDataSource,、ObjectDataSource、XmlDataSource、和SiteMapDataSource。

基于已有的业务逻辑类我们将使用ObjectDataSource。

ObjectDataSource充当别的对象的代理。

通过配置ObjectDataSource,我们指定这些底层的对象,还有这些对象的方法如何映射到ObjectDataSource的Select、Insert、Update和Delete方法。

一旦底层的对象被指定并且其方法映射到ObjectDataSource的方法后,我们就可以把ObjectDataSource绑定到页面上的DataWeb服务器控件。

ASP.NET提供了许多DataWeb服务器控件,包括GridView、DetailsView、RadioButtonList和DropDownList等等。

在页面的生命周期中,DataWeb服务器控件可能需要访问它所绑定的数据,这将通过调用ObjectDataSource的Select方法来实现;如果这个DataWeb服务器控件还支持插入、更新或者删除,那么将调用ObjectDataSource的Insert、Update或者Delete方法。

这些调用会通过ObjectDataSource被发送到适当的底层对象的方法。

第一步:

添加和配置ObjectDataSource控件

(1)新建一个“Web窗体”模板文件(UserView.aspx),语言VisualC#,选择“将代码发在单独文件中”。

(2)拖入一个“GirdView”控件,点击智能标记中的“配置数据源”,选择“新建数据源…”,进入数据源配置向导来添加一个ObjectDataSource。

(3)进入数据源配置向导。

首先给ObjectDataSource指定一个业务对象。

如果勾选上“只显示数据组件”,那么下拉框中就仅仅显示出那些以[DataObject]特征修饰过的对象。

可以不勾选“只显示数据组件”从而看见所有对象。

从下拉列表中选择业务对象UserBLL。

根据页面设计的需要为SELECT,UPDATE,INSERT及DELETE操作指定相应的业务对象的方法。

这些方法已经在业务逻辑层中定义。

如果用GridView及DetailsView服务器控件呈现数据,SELECT操作是必须的。

第二步:

配置GridView

从GridView的智能标记点选“编辑列”,为“选定的字段”指定标题名,格式,删除不需要的列,添加命令字段(CommandField)等。

操作比较繁琐,看参考相关资料。

完成后的样子类似下图:

根据设计需求将页面设计完成。

至此,表示层的搭建过程简单演示一下。

三.总结

用了几天时间将前段时间的学习和项目开发中的框架构建简单做了个总结,这不是一个教程类的文章,许多细节性的东西不可能面面俱到。

程序开发是一件比较辛苦的事,过程可能很枯燥,不过对此感兴趣的人会在不断学习中体会到其中的乐趣。

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

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2