爱问 爱问共享资料 爱问分类
首页 > > > ASP.NET网站开发架构.pdf

ASP.NET网站开发架构.pdf

ASP.NET网站开发架构.pdf

上传者: goodlook6
637次下载 0人收藏 暂无简介 简介 2012-02-20 举报

简介:ASP.NET

进入第17章:378第16章ASP.NET的安全性一学就会ASP.NET2.0网络编程学习笔记379:一学就会ASP.NET2.0网络编程学习笔记378379本章内容包括: 建立一个Web自定义控件以及如何将自 定义控件应用到具体的Web项目中。  如何给一个控件创建子控件。  使用控件分析器来简化子控件标记的代码,  并说明控件分析器的完整执行过程。  编写一个简单的复合控件。进入第17章在ASP.NET中提供了Web用户控件的功能支持。使用控件可以减少页面代码并且具有易于维护的好处。不过Web用户控件必须随带一个扩展名为“.ascx”的文件,所以在部署上比较麻烦。在本章中将介绍另外一种相对灵活且强大的控件建立方式——“Web自定义控件”。在本章中我们将学习Web自定义控件开发的关键技术,通过本章的学习,读者将熟悉Web自定义控件的基本开发过程、控件的子控件创建过程,以及复合控件的编写。拉开崭新的学习帷幕第17章ASP.NET网站开发架构ASP.NET2.0网络编程学习笔记-ok出片文件.indd3792008-3-817:00:01:380第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记381:380第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记38117.1B/S架构设计理念随着计算机网络技术的快速发展,网络带宽的逐步稳定和不断提升,基于B/S(Browser/Server)体系的应用软件得到了迅速发展。与传统的C/S(Client/Server)体系的应用软件相比,其最大的不同是:B/S体系的应用软件使用网络浏览器作为与用户交互的平台,而C/S则需要开发专用的应用程序。基于B/S体系的软件系统有以下几个优点:简化客户端,方便安装和部署。它不需要像C/S系统那样在多个计算机上安装同样的客户端应用程序,而只是需要安装常用的Web浏览器。这样除去可以节省计算机硬盘空间之外,还降低了用户使用软件的难度。便于开发和维护,在修改了应用程序的运行逻辑后,不需要提示用户必须更新浏览器。而传统的C/S系统则必须强制用户更新客户端程序。B/S系统可以建立在目前任意的一个可靠的服务器软件平台之上(例如IIS6)。而传统的C/S则可能需要编写独立的服务器软件,整个系统的可靠性无法得到保证。Web浏览器是基于简单的HTTP协议。而传统的C/S可以自己定制通信协议,但各个协议之间可能不易协调而造成冲突。另外,B/S系统与C/S系统的架构方式也会有所不同,C/S比较常见的是使用两层架构,而B/S则是三层架构。从本章17.1.1节开始将讨论多层架构的问题。17.1.1单层设计架构本节以一个简单的留言板程序来说明单层结构的特征。首先对该程序作一个简单的介绍,留言板解决方案名称为TraceLWord1,解决方案中只有一个Web项目,该项目中只有两个页面:ListLWord.aspx,列表显示数据库中的每条留言,所对应的后台程序文件是ListLWord.aspx.cs。PostLWord.aspx,发送留言到数据库,所对应的后台程序文件是PostLWord.aspx.cs。留言板所访问的数据库是TraceLWordDB.mdb,可以在本书光盘中找到。其中包含两张数据表,RegUser注册用户数据表和LWord留言信息数据表。两张数据表的具体结构分别如表17.1和表17.2所示:表17.1RegUser注册用户数据表字段名称数据类型备注说明RegUserID自动编号注册用户编号NickName文本,长度=32用户昵称PassWord文本,长度=255登陆密码表17.2LWord留言信息数据表字段名称数据类型备注说明LWordID自动编号留言记录编号FromUser文本,长度=32留言发送人名称ASP.NET2.0网络编程学习笔记-ok出片文件.indd3802008-3-817:00:01:380第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记381:380第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记381下面给出留言板的部分代码,完整代码可以在随书附带的光盘中找到。usingSystem;usingSystem.Data;usingSystem.Data.OleDb;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.UI.WebControls;namespaceTraceLWord1.WebUI{publicpartialclassListLWord:System.Web.UI.Page{//留言列表控件protectedSystem.Web.UI.WebControls.Repeaterm_aspLWordList;protectedvoidPage_Load(objectsender,EventArgse){this.LWords_DataBind();}//获取所有留言信息privateconststringSQL_GetAllLWords=@"SELECT*FROM[LWord]ORDERBY[LWordID]DESC";//绑定留言信息privatevoidLWords_DataBind(){OleDbConnectiondbConn=newOleDbConnection(ConfigurationManager.ConnectionStrings["TraceLWordDB"].ConnectionString);OleDbDataAdapterdbAdp=newOleDbDataAdapter(SQL_GetAllLWords,dbConn);DataSetds=newDataSet();dbAdp.Fill(ds,"LWordList");this.m_aspLWordList.DataSource=ds.Tables["LWordList"].DefaultView;this.m_aspLWordList.DataBind();}}}在页面加载的时候绑定留言信息在17.1.3节介绍二层架构时,被括号包含的代码会加以改动注意:数据绑定以后会在页面中显示出来下面给出留言板的部分代码,完整代码可以在随书附带的光盘中找到。usingSystem.Data.OleDb;usingSystem.Configuration;ListLWord.aspx部分页面代码:<asp:Repeaterrunat="server"ID="m_aspLWordList"><ItemTemplate><%#DataBinder.Eval(Container.DataItem,"FromUser")%>,<%#DataBinder.Eval(Container.DataItem,"PostTime")%><%#DataBinder.Eval(Container.DataItem,"TextContent")%></ItemTemplate></asp:Repeater>控件在代码文件中的定义ListLWord.aspx.cs代码:字段名称数据类型备注说明TextContent备注留言内容PostTime日期时间留言发送时间默认值为当前时间ASP.NET2.0网络编程学习笔记-ok出片文件.indd3812008-3-817:00:06:382第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记383:382第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记383PostLWord.aspx部分页面代码:用户昵称:<asp:TextBoxrunat="server"ID="m_aspNickName"/>,用户密码:<asp:TextBoxrunat="server"ID="m_aspPassWord"TextMode="Password"/>……<asp:TextBoxrunat="server"ID="m_aspTextContent"TextMode="MultiLine"Rows="8"Columns="72"/>……<asp:Buttonrunat="server"ID="m_aspPostCmd"Text="发送留言"PostLWord.aspx.cs代码:usingSystem;usingSystem.Data;usingSystem.Data.OleDb;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.UI.WebControls;namespaceTraceLWord1.WebUI{publicpartialclassPostLWord:System.Web.UI.Page{//用户昵称DataBinder.Eval(Container.DataItem,"PostTime")DataBinder.Eval(Container.DataItem,"FromUser")DataBinder.Eval(Container.DataItem,"TextContent")图17.1留言列表页面124当用户请求ListLWord.aspx页面时,Page_Load会得到调用。在Page_Load函数中又调用了Lwords_DataBind函数来绑定留言信息列表。页面的执行结果如图17.1所示:<asp:TextBoxrunat="server"ID="m_aspTextContent"3ASP.NET2.0网络编程学习笔记-ok出片文件.indd3822008-3-817:00:09:382第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记383:382第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记383protectedSystem.Web.UI.WebControls.TextBoxm_aspNickName;//用户密码protectedSystem.Web.UI.WebControls.TextBoxm_aspPassWord;//留言内容protectedSystem.Web.UI.WebControls.TextBoxm_aspTextContent;//发送命令按钮protectedSystem.Web.UI.WebControls.Buttonm_aspPostCmd;protectedvoidPage_Init(objectsender,EventArgse){this.m_aspPostCmd.Click+=newEventHandler(PostCmd_Click);}//获取注册用户信息privateconststringSQL_GetRegUser=@"SELECT*FROM[RegUser]WHERE[NickName]=@NickName";//注册新用户privateconststringSQL_Register=@"INSERTINTO[RegUser]([NickName],[PassWord])VALUES(@NickName,@PassWord)";//发送新留言privateconststringSQL_PostLWord=@"INSERTINTO[LWord]([FromUser],[TextContent])VALUES(@FromUser,@TextContent)";//发送留言信息到数据库privatevoidPostCmd_Click(objectsender,EventArgse){//获取用户昵称stringnickName=this.m_aspNickName.Text;//获取用户密码stringpassWord=this.m_aspPassWord.Text;//获取留言内容stringtextContent=this.m_aspTextContent.Text;//用户昵称和密码不能为空if(String.IsNullOrEmpty(nickName)||String.IsNullOrEmpty(passWord))thrownewException("用户昵称或密码为空");//留言内容不能为空if(String.IsNullOrEmpty(textContent))thrownewException("留言内容为空");//用户是否已注册boolisRegistered=false;//存于数据库中的用户密码stringpassWordInDB=null;OleDbConnectiondbConn=newOleDbConnection(ConfigurationManager.ConnectionStrings["TraceLWordDB"].ConnectionString);OleDbCommandgetRegUserDBCmd=newOleDbCommand(SQL_GetRegUser,dbConn);//设置用户昵称14protectedSystem.Web.UI.WebControls.TextBoxm_aspTextContent;32ASP.NET2.0网络编程学习笔记-ok出片文件.indd3832008-3-817:00:10:384第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记385:384第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记385getRegUserDBCmd.Parameters.Add("@NickName",OleDbType.VarWChar,32).Value=nickName;try{dbConn.Open();OleDbDataReaderdr=getRegUserDBCmd.ExecuteReader();if(dr.Read()){isRegistered=true;//获取存于数据库中的用户密码passWordInDB=Convert.ToString(dr["PassWord"]);}}catch(Exceptionex){throwex;}finally{dbConn.Close();}if(isRegistered){//如果用户已经注册,则比较用户密码if(String.Compare(passWord,passWordInDB)!=0)thrownewException("用户密码错误");//如果密码相同则添加留言信息//OleDbCommandpostLWordDBCmd=newOleDbCommand(SQL_PostLWord,dbConn);//设置留言发送人昵称postLWordDBCmd.Parameters.Add("@FromUser",OleDbType.VarWChar,32).Value=nickName;//设置留言内容postLWordDBCmd.Parameters.Add("@TextContent",OleDbType.LongVarWChar).Value=textContent;try{dbConn.Open();postLWordDBCmd.ExecuteNonQuery();}catch(Exceptionex){throwex;}finally{dbConn.Close();}}else{如果用户名称不存在,那么首先注册新用户,之后添加留言信息首先判断用户名称是否已经存在。如果已经存在,那么在验证用户密码成功之后添加留言信息ASP.NET2.0网络编程学习笔记-ok出片文件.indd3842008-3-817:00:11:384第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记385:384第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记385//如果用户未注册,那么先注册新用户,然后添加留言//dbConn.Open();try{OleDbCommandregisterDBCmd=newOleDbCommand(SQL_Register,dbConn);//设置用户昵称registerDBCmd.Parameters.Add("@NickName",OleDbType.VarWChar,32).Value=nickName;//设置用户密码registerDBCmd.Parameters.Add("@PassWord",OleDbType.VarWChar,255).Value=passWord;registerDBCmd.ExecuteNonQuery();  OleDbCommandpostLWordDBCmd=newOleDbCommand(SQL_PostLWord,dbConn);//设置留言发送人昵称postLWordDBCmd.Parameters.Add("@FromUser",OleDbType.VarWChar,32).Value=nickName;//设置留言内容postLWordDBCmd.Parameters.Add("@TextContent",OleDbType.LongVarWChar).Value=    textContent;postLWordDBCmd.ExecuteNonQuery();}  catch(Exceptionex){throwex;}finally{dbConn.Close();}}//跳转到留言显示页面Response.Redirect("ListLWord.aspx",true);}}  }留言发送完成以后,应用程序会回转到留言列表页面被括号括中的代码在17.1.3节介绍二层结构时会加以改动。注意:节介绍二层ASP.NET2.0网络编程学习笔记-ok出片文件.indd3852008-3-817:00:13:386第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记387:386第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记387当用户发送新留言时,系统会要求用户输入用户名称和用户密码。在获取到用户名称之后,系统会对用户名称进行验证。如果该用户名称可以在数据库中找到,那么系统会继续验证用户密码。只有当密码与数据库中存放的用户密码完全相同时,才将新的留言信息插入到数据库中。在验证用户名称的过程中,如果没有在数据库中找到该用户名称,也就是说用户是一个新来者,那么首先为该用户注册一个新的账户,之后再将留言信息插入到数据库。简要地说,就是当用户第一次留言时为用户注册。发送留言的流程如图17.2所示:PostLWord.aspx页面如图17.3所示:否是是获取注册用户信息用户已经存在发送留言发送留言注册新用户图17.2发送新留言流程图图17.3留言发送页面ASP.NET2.0网络编程学习笔记-ok出片文件.indd3862008-3-817:00:19:386第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记387:386第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记387单层结构的应用程序比较简单,所有代码都写在后台文件中,这非常类似于ASP编程方式。下一小节将会在这些代码的基础上提炼出二层架构。17.1.2二层设计架构如果将TraceLWord1中所有操作数据库的代码全部提炼出来,放入到另外一个类文件里以供统一调用,那就是简单的二层架构!箭头表示的是依赖方向,即ListLWord类需要调用OleDbAdapter和OleDbConnection两个类才能完成任务如图17.4所示,在TraceLWord1中ListLWord和PostLWord两个页面类都调用了数据库操作类OleDbConnection、OleDbAdapter和OleDbCommand。为了实现简单的二层结构,可以建立一个“中介者类”,使两个页面类摆脱对数据库操作类的直接调用,如图17.5所示。OleDbAdapterOleDbConnectionOleDbCommandListLWordPostLWord图17.4TraceLWord1中各个类之间的依赖关系图17.5加入中介者类之后各个类的依赖关系“中介者类”,使两个页面类摆脱对数据库操作类的直接调用,如图17.5所示。“中介者类”,使两个页面类摆脱对数据库操作类的直接调用,如图17.5所示。ListLWordPostLWord中介者OleDbConnectionOleDbAdapterOleDbCommand新建的DBTask类,将充当这个中介者ASP.NET2.0网络编程学习笔记-ok出片文件.indd3872008-3-817:00:22:388第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记389:388第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记389在新建的TraceLWord2解决方案中,添加了类DBTask充当“中介者”,其代码内容如下:usingSystem;usingSystem.Configuration;usingSystem.Data;usingSystem.Data.OleDb;namespaceTraceLWord2.WebUI{publicclassDBTask{//获取所有留言信息privateconststringSQL_GetAllLWords=@"SELECT*FROM[LWord]ORDERBY[LWordID]DESC";//发送新留言privateconststringSQL_PostLWord=@"INSERTINTO[LWord]([FromUser],[TextContent])VALUES(@FromUser,@TextContent)";//获取注册用户信息privateconststringSQL_GetRegUser=@"SELECT*FROM[RegUser]WHERE[NickName]=@NickName";//注册新用户privateconststringSQL_Register=@"INSERTINTO[RegUser]([NickName],[PassWord])VALUES(@NickName,@PassWord)";//获取留言信息publicDataSetListLWord(){OleDbConnectiondbConn=this.CreateConnection();OleDbDataAdapterdbAdp=newOleDbDataAdapter(SQL_GetAllLWords,dbConn);DataSetds=newDataSet();dbAdp.Fill(ds,"LWordList");returnds;}//发送新留言publicvoidPostLWord(stringnickName,stringtextContent){OleDbConnectiondbConn=this.CreateConnection();OleDbCommanddbCmd=newOleDbCommand(SQL_PostLWord,dbConn);//设置留言发送人昵称dbCmd.Parameters.Add("@FromUser",OleDbType.VarWChar,32).Value=nickName;//设置留言内容dbCmd.Parameters.Add("@TextContent",OleDbType.LongVarWChar).Value=textContent;try{dbConn.Open();dbCmd.ExecuteNonQuery();}catch(Exceptionex){throwex;}finally{dbConn.Close();将TraceLWord1中用于获取留言信息的代码提取到这个函数将TraceLWord1中用于发送留言信息的代码提取到这个函数ASP.NET2.0网络编程学习笔记-ok出片文件.indd3882008-3-817:00:24将TraceLWord1中用于注册用户信息的代码提取到这个函数:388第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记389:388第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记389}}//获取注册用户信息publicDataSetGetRegUser(stringnickName){OleDbConnectiondbConn=this.CreateConnection();OleDbDataAdapterdbAdp=newOleDbDataAdapter(SQL_GetRegUser,dbConn);//设置用户昵称dbAdp.SelectCommand.Parameters.Add("@NickName",OleDbType.VarWChar,32).Value=nickName;DataSetds=newDataSet("RegUserDS");dbAdp.Fill(ds,"RegUser");returnds;}//注册新用户publicvoidRegister(stringnickName,stringpassWord){OleDbConnectiondbConn=this.CreateConnection();OleDbCommandregisterDBCmd=newOleDbCommand(SQL_Register,dbConn);try{//设置用户昵称registerDBCmd.Parameters.Add("@NickName",OleDbType.VarWChar,32).Value=nickName;//设置用户密码registerDBCmd.Parameters.Add("@PassWord",OleDbType.VarWChar,255).Value=passWord;registerDBCmd.ExecuteNonQuery();}catch(Exceptionex){throwex;}finally{dbConn.Close();}}//建立数据库连接privateOleDbConnectionCreateConnection(){returnnewOleDbConnection(ConfigurationManager.ConnectionStrings["TraceLWordDB"].ConnectionString);}}}将TraceLWord1中用于获取用户信息的代码提取到这个函数DBTask类只是把原来散落在页面上的关于数据库访问的代码全部都集结在一起,然后提供不同的功能函数以供页面调用。这是给TraceLWord1代码加上了一层包装。那么相应的也要修改ListLWord.aspx.cs和PostLWord.aspx.cs这两个文件:ASP.NET2.0网络编程学习笔记-ok出片文件.indd3892008-3-817:00:24:390第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记391:390第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记391//绑定留言信息privatevoidLWords_DataBind(){this.m_aspLWordList.DataSource=(newDBTask()).ListLWord();this.m_aspLWordList.DataBind();}//发送留言信息到数据库privatevoidPostCmd_Click(objectsender,EventArgse){//获取用户昵称stringnickName=this.m_aspNickName.Text;//获取用户密码stringpassWord=this.m_aspPassWord.Text;//获取留言内容stringtextContent=this.m_aspTextContent.Text;//用户昵称和密码不能为空if(String.IsNullOrEmpty(nickName)||String.IsNullOrEmpty(passWord))thrownewException("用户昵称或密码为空");//留言内容不能为空if(String.IsNullOrEmpty(textContent))thrownewException("留言内容为空");//建立数据库任务实例DBTaskdbTask=newDBTask();//获取注册用户信息DataSetds=dbTask.GetRegUser(nickName);if(ds!=null&&ds.Tables.Count>0&&ds.Tables[0].Rows.Count>0){//如果用户已注册,则验证用户密码if((string)ds.Tables[0].Rows[0]["PassWord"]!=passWord)thrownewException("用户密码错误");}else{//用户未注册,则注册新用户dbTask.Register(nickName,passWord);}//插入新留言信息dbTask.PostLWord(nickName,textContent);//跳转到留言显示页面Response.Redirect("ListLWord.aspx",true);}与TraceLWord1不同,这里建立了DBTask类对象,并调用其中的ListLWord方法,而不是直接出现数据库代码这里也是通过DBTask类对象来访问数据库,而不是直接出现数据库代码ASP.NET2.0网络编程学习笔记-ok出片文件.indd3902008-3-817:00:28:390第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记391:390第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记391收缩上面的代码,就可以看到下面的调用形式(以显示留言信息为例):收缩上面的代码,就可以看到下面的调用形式(以显示留言信息为例)://绑定留言信息,位于ListLWord.aspx.cs文件privatevoidLWords_DataBind(){this.m_aspLWordList.DataSource=(newDBTask()).ListLWord();this.m_aspLWordList.DataBind();}//获取留言信息,位于DBTask.cs文件publicDataSetListLWord(){……}在上述代码中使用DBTask类作为中介者,这满足了“设计模式”中的一个重要原则:“迪米特法则”。该法则的主旨是:让一个类尽量少地与其他的类发生联系。在TraceLWord1中,两个页面类都与数据库操作类发生了联系,所以它破坏了“迪米特法则”。其坏处是:如果数据库操作类发生变化,会造成两个页面类也要做出相应的变化。这种连锁反应式的变化会增加软件的维护成本,所以是多余的、不必要的。在TraceLWord2中利用一个“中介者”类抵消这种变化影响,而这个“中介者”类其实就是“门面模式”中的“门面”。门面模式要解决这样的一个问题:如果众多类之间存在关联,从而形成一张关系网,如图17.6所示。那么当其中一个类被修改的时候,很可能会导致这张网中的其他类也要随之修改,这增加了软件的维护难度。为了避免这样的问题出现,所以引入一个“中介者”类,并且令所有类都只与这个中介者类进行通信,如图17.7所示。这样当其中一个类修改的时候,只修改这个中介者类就可以了,并不会导致其他类也要随之修改,这样也就降低了软件的维护难度。当其中一个类发生改变时,会导致其他类也要随之改变Class1Class2Class4Class3Class5图17.6各个类之间的网状联系{this.m_aspLWordList.DataSource=(newDBTask()).ListLWord();this.m_aspLWordList.DataBind();}ASP.NET2.0网络编程学习笔记-ok出片文件.indd3912008-3-817:00:38:392第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记393:392第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记393加入中介者类之后解除了各类之间复杂的依赖关系,也就避免了牵一发而动全身的问题Class1图17.7加入中介者类17.1.3三层设计架构在TraceLWord2中,虽然可以通过中介者DBTask类使两个页面类摆脱对数据库操作类的依赖,但是在页面类中还存留一些对留言规则描述的代码。如果将这些代码也提炼出来,放入到另外一个类文件里以供统一调用,形成一个专门用于规则描述的类,如图17.8所示。这样在代码组织上就形成了页面代码、规则描述代码、数据库操作代码的格局,这就是简单的三层结构!在TraceLWord3中将使用InterService类来描述规则ListLWordPostLWord规则描述DBTaskOleDbConnectionOleDbAdapterOleDbCommand图17.8加入规则描述中介者类Class2Class4Class5Class3ASP.NET2.0网络编程学习笔记-ok出片文件.indd3922008-3-817:00:41:392第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记393:392第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记393在新建的TraceLWord3中,添加了类InterService来描述留言规则。关于留言规则,简要地说就是当用户第一次留言时为用户注册。将TraceLWord2中有关留言信息获取和留言发送部分的代码剪切出来并粘贴到一个新类里,这就是InterService。其代码如下:usingSystem;usingSystem.Data;namespaceTraceLWord3.WebUI{publicclassInterService{//获取留言信息publicDataSetListLWord(){return(newDBTask()).ListLWord();}//发送留言信息到数据库publicvoidPostLWord(stringnickName,stringpassWord,stringtextContent){  //用户昵称和密码不能为空if(String.IsNullOrEmpty(nickName)||String.IsNullOrEmpty(passWord))thrownewException("用户昵称或密码为空");//留言内容不能为空if(String.IsNullOrEmpty(textContent))thrownewException("留言内容为空");//获取注册用户信息DataSetds=this.GetRegUser(nickName);if(ds!=null&&ds.Tables.Count>0&&ds.Tables[0].Rows.Count>0){//如果用户已注册,则验证用户密码if((string)ds.Tables[0].Rows[0]["PassWord"]!=passWord)thrownewException("用户密码错误");}else{//用户未注册,则注册新用户this.Register(nickName,passWord);}//插入新留言信息(newDBTask()).PostLWord(nickName,textContent);}//获取注册用户信息publicDataSetGetRegUser(stringnickName){return(newDBTask()).GetRegUser(nickName);}//注册新用户publicvoidRegister(stringnickName,stringpassWord){(newDBTask()).Register(nickName,passWord);在TraceLWord2中是不是可以找到类似的代码呢?publicvoidRegister(stringnickName,stringpassWord)在规则描述中需要建立DBTask类对象来访问数据库,而不是直接出现数据库代码ASP.NET2.0网络编程学习笔记-ok出片文件.indd3932008-3-817:00:42:394第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记395:394第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记395在InterService类中,定义了PostLWord函数。该函数封装了发送新留言的处理逻辑,而该逻辑原来出现在页面中。接下来要修改ListLWord.aspx.cs和PostLWord.aspx.cs这两个文件://绑定留言信息privatevoidLWords_DataBind(){this.m_aspLWordList.DataSource=(newInterService()).ListLWord();this.m_aspLWordList.DataBind();}//发送留言信息到数据库privatevoidPostCmd_Click(objectsender,EventArgse){//获取用户昵称stringnickName=this.m_aspNickName.Text;//获取用户密码stringpassWord=this.m_aspPassWord.Text;//获取留言内容stringtextContent=this.m_aspTextContent.Text;//发送留言信息(newInterService()).PostLWord(nickName,passWord,textContent);//跳转到留言显示页面Response.Redirect("ListLWord.aspx",true);}与TraceLWord2不同,这里建立了InterService类对象,并调用其中的ListLWord方法与TraceLWord2不同,这里也是建立了InterService类对象,并调用其中的PostLWord方法。在该方法中描述了留言规则}}}收缩上面的代码,就可以看到下面的调用形式(以显示留言信息为例)://绑定留言信息,位于ListLWord.aspx.cs文件privatevoidLWords_DataBind(){this.m_aspLWordList.DataSource=(newInterService()).ListLWord();this.m_aspLWordList.DataBind();}//获取留言信息,位于InterService.cs文件publicDataSetListLWord(){return(newDBTask()).ListLWord();}//获取留言信息,位于DBTask.cs文件publicDataSetListLWord(){……}ASP.NET2.0网络编程学习笔记-ok出片文件.indd3942008-3-8

ASP.NET网站开发架构.pdf

ASP.NET网站开发架构.pdf

上传者: goodlook6
637次下载 0人收藏 暂无简介 简介 2012-02-20 举报

简介:ASP.NET

进入第17章:378第16章ASP.NET的安全性一学就会ASP.NET2.0网络编程学习笔记379:一学就会ASP.NET2.0网络编程学习笔记378379本章内容包括: 建立一个Web自定义控件以及如何将自 定义控件应用到具体的Web项目中。  如何给一个控件创建子控件。  使用控件分析器来简化子控件标记的代码,  并说明控件分析器的完整执行过程。  编写一个简单的复合控件。进入第17章在ASP.NET中提供了Web用户控件的功能支持。使用控件可以减少页面代码并且具有易于维护的好处。不过Web用户控件必须随带一个扩展名为“.ascx”的文件,所以在部署上比较麻烦。在本章中将介绍另外一种相对灵活且强大的控件建立方式——“Web自定义控件”。在本章中我们将学习Web自定义控件开发的关键技术,通过本章的学习,读者将熟悉Web自定义控件的基本开发过程、控件的子控件创建过程,以及复合控件的编写。拉开崭新的学习帷幕第17章ASP.NET网站开发架构ASP.NET2.0网络编程学习笔记-ok出片文件.indd3792008-3-817:00:01:380第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记381:380第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记38117.1B/S架构设计理念随着计算机网络技术的快速发展,网络带宽的逐步稳定和不断提升,基于B/S(Browser/Server)体系的应用软件得到了迅速发展。与传统的C/S(Client/Server)体系的应用软件相比,其最大的不同是:B/S体系的应用软件使用网络浏览器作为与用户交互的平台,而C/S则需要开发专用的应用程序。基于B/S体系的软件系统有以下几个优点:简化客户端,方便安装和部署。它不需要像C/S系统那样在多个计算机上安装同样的客户端应用程序,而只是需要安装常用的Web浏览器。这样除去可以节省计算机硬盘空间之外,还降低了用户使用软件的难度。便于开发和维护,在修改了应用程序的运行逻辑后,不需要提示用户必须更新浏览器。而传统的C/S系统则必须强制用户更新客户端程序。B/S系统可以建立在目前任意的一个可靠的服务器软件平台之上(例如IIS6)。而传统的C/S则可能需要编写独立的服务器软件,整个系统的可靠性无法得到保证。Web浏览器是基于简单的HTTP协议。而传统的C/S可以自己定制通信协议,但各个协议之间可能不易协调而造成冲突。另外,B/S系统与C/S系统的架构方式也会有所不同,C/S比较常见的是使用两层架构,而B/S则是三层架构。从本章17.1.1节开始将讨论多层架构的问题。17.1.1单层设计架构本节以一个简单的留言板程序来说明单层结构的特征。首先对该程序作一个简单的介绍,留言板解决方案名称为TraceLWord1,解决方案中只有一个Web项目,该项目中只有两个页面:ListLWord.aspx,列表显示数据库中的每条留言,所对应的后台程序文件是ListLWord.aspx.cs。PostLWord.aspx,发送留言到数据库,所对应的后台程序文件是PostLWord.aspx.cs。留言板所访问的数据库是TraceLWordDB.mdb,可以在本书光盘中找到。其中包含两张数据表,RegUser注册用户数据表和LWord留言信息数据表。两张数据表的具体结构分别如表17.1和表17.2所示:表17.1RegUser注册用户数据表字段名称数据类型备注说明RegUserID自动编号注册用户编号NickName文本,长度=32用户昵称PassWord文本,长度=255登陆密码表17.2LWord留言信息数据表字段名称数据类型备注说明LWordID自动编号留言记录编号FromUser文本,长度=32留言发送人名称ASP.NET2.0网络编程学习笔记-ok出片文件.indd3802008-3-817:00:01:380第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记381:380第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记381下面给出留言板的部分代码,完整代码可以在随书附带的光盘中找到。usingSystem;usingSystem.Data;usingSystem.Data.OleDb;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.UI.WebControls;namespaceTraceLWord1.WebUI{publicpartialclassListLWord:System.Web.UI.Page{//留言列表控件protectedSystem.Web.UI.WebControls.Repeaterm_aspLWordList;protectedvoidPage_Load(objectsender,EventArgse){this.LWords_DataBind();}//获取所有留言信息privateconststringSQL_GetAllLWords=@"SELECT*FROM[LWord]ORDERBY[LWordID]DESC";//绑定留言信息privatevoidLWords_DataBind(){OleDbConnectiondbConn=newOleDbConnection(ConfigurationManager.ConnectionStrings["TraceLWordDB"].ConnectionString);OleDbDataAdapterdbAdp=newOleDbDataAdapter(SQL_GetAllLWords,dbConn);DataSetds=newDataSet();dbAdp.Fill(ds,"LWordList");this.m_aspLWordList.DataSource=ds.Tables["LWordList"].DefaultView;this.m_aspLWordList.DataBind();}}}在页面加载的时候绑定留言信息在17.1.3节介绍二层架构时,被括号包含的代码会加以改动注意:数据绑定以后会在页面中显示出来下面给出留言板的部分代码,完整代码可以在随书附带的光盘中找到。usingSystem.Data.OleDb;usingSystem.Configuration;ListLWord.aspx部分页面代码:<asp:Repeaterrunat="server"ID="m_aspLWordList"><ItemTemplate><%#DataBinder.Eval(Container.DataItem,"FromUser")%>,<%#DataBinder.Eval(Container.DataItem,"PostTime")%><%#DataBinder.Eval(Container.DataItem,"TextContent")%></ItemTemplate></asp:Repeater>控件在代码文件中的定义ListLWord.aspx.cs代码:字段名称数据类型备注说明TextContent备注留言内容PostTime日期时间留言发送时间默认值为当前时间ASP.NET2.0网络编程学习笔记-ok出片文件.indd3812008-3-817:00:06:382第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记383:382第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记383PostLWord.aspx部分页面代码:用户昵称:<asp:TextBoxrunat="server"ID="m_aspNickName"/>,用户密码:<asp:TextBoxrunat="server"ID="m_aspPassWord"TextMode="Password"/>……<asp:TextBoxrunat="server"ID="m_aspTextContent"TextMode="MultiLine"Rows="8"Columns="72"/>……<asp:Buttonrunat="server"ID="m_aspPostCmd"Text="发送留言"PostLWord.aspx.cs代码:usingSystem;usingSystem.Data;usingSystem.Data.OleDb;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.UI.WebControls;namespaceTraceLWord1.WebUI{publicpartialclassPostLWord:System.Web.UI.Page{//用户昵称DataBinder.Eval(Container.DataItem,"PostTime")DataBinder.Eval(Container.DataItem,"FromUser")DataBinder.Eval(Container.DataItem,"TextContent")图17.1留言列表页面124当用户请求ListLWord.aspx页面时,Page_Load会得到调用。在Page_Load函数中又调用了Lwords_DataBind函数来绑定留言信息列表。页面的执行结果如图17.1所示:<asp:TextBoxrunat="server"ID="m_aspTextContent"3ASP.NET2.0网络编程学习笔记-ok出片文件.indd3822008-3-817:00:09:382第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记383:382第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记383protectedSystem.Web.UI.WebControls.TextBoxm_aspNickName;//用户密码protectedSystem.Web.UI.WebControls.TextBoxm_aspPassWord;//留言内容protectedSystem.Web.UI.WebControls.TextBoxm_aspTextContent;//发送命令按钮protectedSystem.Web.UI.WebControls.Buttonm_aspPostCmd;protectedvoidPage_Init(objectsender,EventArgse){this.m_aspPostCmd.Click+=newEventHandler(PostCmd_Click);}//获取注册用户信息privateconststringSQL_GetRegUser=@"SELECT*FROM[RegUser]WHERE[NickName]=@NickName";//注册新用户privateconststringSQL_Register=@"INSERTINTO[RegUser]([NickName],[PassWord])VALUES(@NickName,@PassWord)";//发送新留言privateconststringSQL_PostLWord=@"INSERTINTO[LWord]([FromUser],[TextContent])VALUES(@FromUser,@TextContent)";//发送留言信息到数据库privatevoidPostCmd_Click(objectsender,EventArgse){//获取用户昵称stringnickName=this.m_aspNickName.Text;//获取用户密码stringpassWord=this.m_aspPassWord.Text;//获取留言内容stringtextContent=this.m_aspTextContent.Text;//用户昵称和密码不能为空if(String.IsNullOrEmpty(nickName)||String.IsNullOrEmpty(passWord))thrownewException("用户昵称或密码为空");//留言内容不能为空if(String.IsNullOrEmpty(textContent))thrownewException("留言内容为空");//用户是否已注册boolisRegistered=false;//存于数据库中的用户密码stringpassWordInDB=null;OleDbConnectiondbConn=newOleDbConnection(ConfigurationManager.ConnectionStrings["TraceLWordDB"].ConnectionString);OleDbCommandgetRegUserDBCmd=newOleDbCommand(SQL_GetRegUser,dbConn);//设置用户昵称14protectedSystem.Web.UI.WebControls.TextBoxm_aspTextContent;32ASP.NET2.0网络编程学习笔记-ok出片文件.indd3832008-3-817:00:10:384第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记385:384第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记385getRegUserDBCmd.Parameters.Add("@NickName",OleDbType.VarWChar,32).Value=nickName;try{dbConn.Open();OleDbDataReaderdr=getRegUserDBCmd.ExecuteReader();if(dr.Read()){isRegistered=true;//获取存于数据库中的用户密码passWordInDB=Convert.ToString(dr["PassWord"]);}}catch(Exceptionex){throwex;}finally{dbConn.Close();}if(isRegistered){//如果用户已经注册,则比较用户密码if(String.Compare(passWord,passWordInDB)!=0)thrownewException("用户密码错误");//如果密码相同则添加留言信息//OleDbCommandpostLWordDBCmd=newOleDbCommand(SQL_PostLWord,dbConn);//设置留言发送人昵称postLWordDBCmd.Parameters.Add("@FromUser",OleDbType.VarWChar,32).Value=nickName;//设置留言内容postLWordDBCmd.Parameters.Add("@TextContent",OleDbType.LongVarWChar).Value=textContent;try{dbConn.Open();postLWordDBCmd.ExecuteNonQuery();}catch(Exceptionex){throwex;}finally{dbConn.Close();}}else{如果用户名称不存在,那么首先注册新用户,之后添加留言信息首先判断用户名称是否已经存在。如果已经存在,那么在验证用户密码成功之后添加留言信息ASP.NET2.0网络编程学习笔记-ok出片文件.indd3842008-3-817:00:11:384第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记385:384第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记385//如果用户未注册,那么先注册新用户,然后添加留言//dbConn.Open();try{OleDbCommandregisterDBCmd=newOleDbCommand(SQL_Register,dbConn);//设置用户昵称registerDBCmd.Parameters.Add("@NickName",OleDbType.VarWChar,32).Value=nickName;//设置用户密码registerDBCmd.Parameters.Add("@PassWord",OleDbType.VarWChar,255).Value=passWord;registerDBCmd.ExecuteNonQuery();  OleDbCommandpostLWordDBCmd=newOleDbCommand(SQL_PostLWord,dbConn);//设置留言发送人昵称postLWordDBCmd.Parameters.Add("@FromUser",OleDbType.VarWChar,32).Value=nickName;//设置留言内容postLWordDBCmd.Parameters.Add("@TextContent",OleDbType.LongVarWChar).Value=    textContent;postLWordDBCmd.ExecuteNonQuery();}  catch(Exceptionex){throwex;}finally{dbConn.Close();}}//跳转到留言显示页面Response.Redirect("ListLWord.aspx",true);}}  }留言发送完成以后,应用程序会回转到留言列表页面被括号括中的代码在17.1.3节介绍二层结构时会加以改动。注意:节介绍二层ASP.NET2.0网络编程学习笔记-ok出片文件.indd3852008-3-817:00:13:386第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记387:386第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记387当用户发送新留言时,系统会要求用户输入用户名称和用户密码。在获取到用户名称之后,系统会对用户名称进行验证。如果该用户名称可以在数据库中找到,那么系统会继续验证用户密码。只有当密码与数据库中存放的用户密码完全相同时,才将新的留言信息插入到数据库中。在验证用户名称的过程中,如果没有在数据库中找到该用户名称,也就是说用户是一个新来者,那么首先为该用户注册一个新的账户,之后再将留言信息插入到数据库。简要地说,就是当用户第一次留言时为用户注册。发送留言的流程如图17.2所示:PostLWord.aspx页面如图17.3所示:否是是获取注册用户信息用户已经存在发送留言发送留言注册新用户图17.2发送新留言流程图图17.3留言发送页面ASP.NET2.0网络编程学习笔记-ok出片文件.indd3862008-3-817:00:19:386第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记387:386第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记387单层结构的应用程序比较简单,所有代码都写在后台文件中,这非常类似于ASP编程方式。下一小节将会在这些代码的基础上提炼出二层架构。17.1.2二层设计架构如果将TraceLWord1中所有操作数据库的代码全部提炼出来,放入到另外一个类文件里以供统一调用,那就是简单的二层架构!箭头表示的是依赖方向,即ListLWord类需要调用OleDbAdapter和OleDbConnection两个类才能完成任务如图17.4所示,在TraceLWord1中ListLWord和PostLWord两个页面类都调用了数据库操作类OleDbConnection、OleDbAdapter和OleDbCommand。为了实现简单的二层结构,可以建立一个“中介者类”,使两个页面类摆脱对数据库操作类的直接调用,如图17.5所示。OleDbAdapterOleDbConnectionOleDbCommandListLWordPostLWord图17.4TraceLWord1中各个类之间的依赖关系图17.5加入中介者类之后各个类的依赖关系“中介者类”,使两个页面类摆脱对数据库操作类的直接调用,如图17.5所示。“中介者类”,使两个页面类摆脱对数据库操作类的直接调用,如图17.5所示。ListLWordPostLWord中介者OleDbConnectionOleDbAdapterOleDbCommand新建的DBTask类,将充当这个中介者ASP.NET2.0网络编程学习笔记-ok出片文件.indd3872008-3-817:00:22:388第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记389:388第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记389在新建的TraceLWord2解决方案中,添加了类DBTask充当“中介者”,其代码内容如下:usingSystem;usingSystem.Configuration;usingSystem.Data;usingSystem.Data.OleDb;namespaceTraceLWord2.WebUI{publicclassDBTask{//获取所有留言信息privateconststringSQL_GetAllLWords=@"SELECT*FROM[LWord]ORDERBY[LWordID]DESC";//发送新留言privateconststringSQL_PostLWord=@"INSERTINTO[LWord]([FromUser],[TextContent])VALUES(@FromUser,@TextContent)";//获取注册用户信息privateconststringSQL_GetRegUser=@"SELECT*FROM[RegUser]WHERE[NickName]=@NickName";//注册新用户privateconststringSQL_Register=@"INSERTINTO[RegUser]([NickName],[PassWord])VALUES(@NickName,@PassWord)";//获取留言信息publicDataSetListLWord(){OleDbConnectiondbConn=this.CreateConnection();OleDbDataAdapterdbAdp=newOleDbDataAdapter(SQL_GetAllLWords,dbConn);DataSetds=newDataSet();dbAdp.Fill(ds,"LWordList");returnds;}//发送新留言publicvoidPostLWord(stringnickName,stringtextContent){OleDbConnectiondbConn=this.CreateConnection();OleDbCommanddbCmd=newOleDbCommand(SQL_PostLWord,dbConn);//设置留言发送人昵称dbCmd.Parameters.Add("@FromUser",OleDbType.VarWChar,32).Value=nickName;//设置留言内容dbCmd.Parameters.Add("@TextContent",OleDbType.LongVarWChar).Value=textContent;try{dbConn.Open();dbCmd.ExecuteNonQuery();}catch(Exceptionex){throwex;}finally{dbConn.Close();将TraceLWord1中用于获取留言信息的代码提取到这个函数将TraceLWord1中用于发送留言信息的代码提取到这个函数ASP.NET2.0网络编程学习笔记-ok出片文件.indd3882008-3-817:00:24将TraceLWord1中用于注册用户信息的代码提取到这个函数:388第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记389:388第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记389}}//获取注册用户信息publicDataSetGetRegUser(stringnickName){OleDbConnectiondbConn=this.CreateConnection();OleDbDataAdapterdbAdp=newOleDbDataAdapter(SQL_GetRegUser,dbConn);//设置用户昵称dbAdp.SelectCommand.Parameters.Add("@NickName",OleDbType.VarWChar,32).Value=nickName;DataSetds=newDataSet("RegUserDS");dbAdp.Fill(ds,"RegUser");returnds;}//注册新用户publicvoidRegister(stringnickName,stringpassWord){OleDbConnectiondbConn=this.CreateConnection();OleDbCommandregisterDBCmd=newOleDbCommand(SQL_Register,dbConn);try{//设置用户昵称registerDBCmd.Parameters.Add("@NickName",OleDbType.VarWChar,32).Value=nickName;//设置用户密码registerDBCmd.Parameters.Add("@PassWord",OleDbType.VarWChar,255).Value=passWord;registerDBCmd.ExecuteNonQuery();}catch(Exceptionex){throwex;}finally{dbConn.Close();}}//建立数据库连接privateOleDbConnectionCreateConnection(){returnnewOleDbConnection(ConfigurationManager.ConnectionStrings["TraceLWordDB"].ConnectionString);}}}将TraceLWord1中用于获取用户信息的代码提取到这个函数DBTask类只是把原来散落在页面上的关于数据库访问的代码全部都集结在一起,然后提供不同的功能函数以供页面调用。这是给TraceLWord1代码加上了一层包装。那么相应的也要修改ListLWord.aspx.cs和PostLWord.aspx.cs这两个文件:ASP.NET2.0网络编程学习笔记-ok出片文件.indd3892008-3-817:00:24:390第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记391:390第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记391//绑定留言信息privatevoidLWords_DataBind(){this.m_aspLWordList.DataSource=(newDBTask()).ListLWord();this.m_aspLWordList.DataBind();}//发送留言信息到数据库privatevoidPostCmd_Click(objectsender,EventArgse){//获取用户昵称stringnickName=this.m_aspNickName.Text;//获取用户密码stringpassWord=this.m_aspPassWord.Text;//获取留言内容stringtextContent=this.m_aspTextContent.Text;//用户昵称和密码不能为空if(String.IsNullOrEmpty(nickName)||String.IsNullOrEmpty(passWord))thrownewException("用户昵称或密码为空");//留言内容不能为空if(String.IsNullOrEmpty(textContent))thrownewException("留言内容为空");//建立数据库任务实例DBTaskdbTask=newDBTask();//获取注册用户信息DataSetds=dbTask.GetRegUser(nickName);if(ds!=null&&ds.Tables.Count>0&&ds.Tables[0].Rows.Count>0){//如果用户已注册,则验证用户密码if((string)ds.Tables[0].Rows[0]["PassWord"]!=passWord)thrownewException("用户密码错误");}else{//用户未注册,则注册新用户dbTask.Register(nickName,passWord);}//插入新留言信息dbTask.PostLWord(nickName,textContent);//跳转到留言显示页面Response.Redirect("ListLWord.aspx",true);}与TraceLWord1不同,这里建立了DBTask类对象,并调用其中的ListLWord方法,而不是直接出现数据库代码这里也是通过DBTask类对象来访问数据库,而不是直接出现数据库代码ASP.NET2.0网络编程学习笔记-ok出片文件.indd3902008-3-817:00:28:390第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记391:390第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记391收缩上面的代码,就可以看到下面的调用形式(以显示留言信息为例):收缩上面的代码,就可以看到下面的调用形式(以显示留言信息为例)://绑定留言信息,位于ListLWord.aspx.cs文件privatevoidLWords_DataBind(){this.m_aspLWordList.DataSource=(newDBTask()).ListLWord();this.m_aspLWordList.DataBind();}//获取留言信息,位于DBTask.cs文件publicDataSetListLWord(){……}在上述代码中使用DBTask类作为中介者,这满足了“设计模式”中的一个重要原则:“迪米特法则”。该法则的主旨是:让一个类尽量少地与其他的类发生联系。在TraceLWord1中,两个页面类都与数据库操作类发生了联系,所以它破坏了“迪米特法则”。其坏处是:如果数据库操作类发生变化,会造成两个页面类也要做出相应的变化。这种连锁反应式的变化会增加软件的维护成本,所以是多余的、不必要的。在TraceLWord2中利用一个“中介者”类抵消这种变化影响,而这个“中介者”类其实就是“门面模式”中的“门面”。门面模式要解决这样的一个问题:如果众多类之间存在关联,从而形成一张关系网,如图17.6所示。那么当其中一个类被修改的时候,很可能会导致这张网中的其他类也要随之修改,这增加了软件的维护难度。为了避免这样的问题出现,所以引入一个“中介者”类,并且令所有类都只与这个中介者类进行通信,如图17.7所示。这样当其中一个类修改的时候,只修改这个中介者类就可以了,并不会导致其他类也要随之修改,这样也就降低了软件的维护难度。当其中一个类发生改变时,会导致其他类也要随之改变Class1Class2Class4Class3Class5图17.6各个类之间的网状联系{this.m_aspLWordList.DataSource=(newDBTask()).ListLWord();this.m_aspLWordList.DataBind();}ASP.NET2.0网络编程学习笔记-ok出片文件.indd3912008-3-817:00:38:392第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记393:392第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记393加入中介者类之后解除了各类之间复杂的依赖关系,也就避免了牵一发而动全身的问题Class1图17.7加入中介者类17.1.3三层设计架构在TraceLWord2中,虽然可以通过中介者DBTask类使两个页面类摆脱对数据库操作类的依赖,但是在页面类中还存留一些对留言规则描述的代码。如果将这些代码也提炼出来,放入到另外一个类文件里以供统一调用,形成一个专门用于规则描述的类,如图17.8所示。这样在代码组织上就形成了页面代码、规则描述代码、数据库操作代码的格局,这就是简单的三层结构!在TraceLWord3中将使用InterService类来描述规则ListLWordPostLWord规则描述DBTaskOleDbConnectionOleDbAdapterOleDbCommand图17.8加入规则描述中介者类Class2Class4Class5Class3ASP.NET2.0网络编程学习笔记-ok出片文件.indd3922008-3-817:00:41:392第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记393:392第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记393在新建的TraceLWord3中,添加了类InterService来描述留言规则。关于留言规则,简要地说就是当用户第一次留言时为用户注册。将TraceLWord2中有关留言信息获取和留言发送部分的代码剪切出来并粘贴到一个新类里,这就是InterService。其代码如下:usingSystem;usingSystem.Data;namespaceTraceLWord3.WebUI{publicclassInterService{//获取留言信息publicDataSetListLWord(){return(newDBTask()).ListLWord();}//发送留言信息到数据库publicvoidPostLWord(stringnickName,stringpassWord,stringtextContent){  //用户昵称和密码不能为空if(String.IsNullOrEmpty(nickName)||String.IsNullOrEmpty(passWord))thrownewException("用户昵称或密码为空");//留言内容不能为空if(String.IsNullOrEmpty(textContent))thrownewException("留言内容为空");//获取注册用户信息DataSetds=this.GetRegUser(nickName);if(ds!=null&&ds.Tables.Count>0&&ds.Tables[0].Rows.Count>0){//如果用户已注册,则验证用户密码if((string)ds.Tables[0].Rows[0]["PassWord"]!=passWord)thrownewException("用户密码错误");}else{//用户未注册,则注册新用户this.Register(nickName,passWord);}//插入新留言信息(newDBTask()).PostLWord(nickName,textContent);}//获取注册用户信息publicDataSetGetRegUser(stringnickName){return(newDBTask()).GetRegUser(nickName);}//注册新用户publicvoidRegister(stringnickName,stringpassWord){(newDBTask()).Register(nickName,passWord);在TraceLWord2中是不是可以找到类似的代码呢?publicvoidRegister(stringnickName,stringpassWord)在规则描述中需要建立DBTask类对象来访问数据库,而不是直接出现数据库代码ASP.NET2.0网络编程学习笔记-ok出片文件.indd3932008-3-817:00:42:394第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记395:394第17章ASP.NET网站开发架构一学就会ASP.NET2.0网络编程学习笔记395在InterService类中,定义了PostLWord函数。该函数封装了发送新留言的处理逻辑,而该逻辑原来出现在页面中。接下来要修改ListLWord.aspx.cs和PostLWord.aspx.cs这两个文件://绑定留言信息privatevoidLWords_DataBind(){this.m_aspLWordList.DataSource=(newInterService()).ListLWord();this.m_aspLWordList.DataBind();}//发送留言信息到数据库privatevoidPostCmd_Click(objectsender,EventArgse){//获取用户昵称stringnickName=this.m_aspNickName.Text;//获取用户密码stringpassWord=this.m_aspPassWord.Text;//获取留言内容stringtextContent=this.m_aspTextContent.Text;//发送留言信息(newInterService()).PostLWord(nickName,passWord,textContent);//跳转到留言显示页面Response.Redirect("ListLWord.aspx",true);}与TraceLWord2不同,这里建立了InterService类对象,并调用其中的ListLWord方法与TraceLWord2不同,这里也是建立了InterService类对象,并调用其中的PostLWord方法。在该方法中描述了留言规则}}}收缩上面的代码,就可以看到下面的调用形式(以显示留言信息为例)://绑定留言信息,位于ListLWord.aspx.cs文件privatevoidLWords_DataBind(){this.m_aspLWordList.DataSource=(newInterService()).ListLWord();this.m_aspLWordList.DataBind();}//获取留言信息,位于InterService.cs文件publicDataSetListLWord(){return(newDBTask()).ListLWord();}//获取留言信息,位于DBTask.cs文件publicDataSetListLWord(){……}ASP.NET2.0网络编程学习笔记-ok出片文件.indd3942008-3-8

相关资料推荐

  • 名称/格式
  • 下载次数
  • 资料大小

用户评论

0/200
暂无评论
上传我的资料

资料阅读排行

该用户的其它资料

关闭

请选择举报的类型

关闭

提示

提交成功!

感谢您对爱问共享资料的支持,我们将尽快核实并处理您的举报信息。

关闭

提示

提交失败!

您的举报信息提交失败,请重试!

关闭

提示

重复举报!

亲爱的用户!感觉您对爱问共享资料的支持,请勿重复举报噢!

全屏 缩小 放大
收藏
资料评价:

/ 0
所需积分:0 立即下载
返回
顶部
举报
资料
关闭

温馨提示

感谢您对爱问共享资料的支持,精彩活动将尽快为您呈现,敬请期待!