三層架構(gòu)的實(shí)現(xiàn)_第1頁(yè)
三層架構(gòu)的實(shí)現(xiàn)_第2頁(yè)
三層架構(gòu)的實(shí)現(xiàn)_第3頁(yè)
三層架構(gòu)的實(shí)現(xiàn)_第4頁(yè)
三層架構(gòu)的實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、ASP.NET三層架構(gòu)應(yīng)用總結(jié)(一)前言:與ASP相比ASP.NET在Web應(yīng)用開(kāi)發(fā)上無(wú)疑更容易,更有效率。Web開(kāi)發(fā)大部分還是圍繞著數(shù)據(jù)操作,建立數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù),編寫(xiě)代碼訪問(wèn)和修改數(shù)據(jù),設(shè)計(jì)界面采集和呈現(xiàn)數(shù)據(jù)。走過(guò)A學(xué)習(xí)入門(mén)階段后,真正開(kāi)始著手開(kāi)發(fā)一個(gè)Web項(xiàng)目時(shí),才發(fā)現(xiàn)錯(cuò)綜復(fù)雜的數(shù)據(jù)與關(guān)聯(lián)根本就不是SqlDataSource和AccessDataSource數(shù)據(jù)源控件能簡(jiǎn)單解決的,而恰恰是被忽視了的一個(gè)ObjectDataSource數(shù)據(jù)源控件才是真正踏入開(kāi)發(fā)門(mén)檻的關(guān)鍵,由此也對(duì)三層架構(gòu)模式有了初步體驗(yàn)。一.ASP.NET三層架構(gòu)介紹設(shè)計(jì)模式中的分層架構(gòu)(可以參考一下J2EE中MVC模式)

2、實(shí)現(xiàn)了各司其職,互不干涉,所以如果一旦哪一層的需求發(fā)生了變化,就只需要更改相應(yīng)的層中的代碼而不會(huì)影響到其它層中的代碼。這樣就能更好的實(shí)現(xiàn)開(kāi)發(fā)中的分工,有利于組件的重用。所以這些年關(guān)于模式的研究有很多成果,應(yīng)用也很廣泛。一個(gè)好的模式在程序開(kāi)發(fā)和后期維護(hù)中作用重大。ASP.NET三層架構(gòu)自底向上分為:數(shù)據(jù)訪問(wèn)層(DAL),業(yè)務(wù)邏輯層(BLL)和表示層(PL)。數(shù)據(jù)訪問(wèn)層(DAL):使用了一個(gè)強(qiáng)類型的DataSet作為數(shù)據(jù)訪問(wèn)層,只是單純的對(duì)數(shù)據(jù)進(jìn)行增,刪,改,查詢和判斷存在等等較通用的數(shù)據(jù)訪問(wèn)方法(由SQL語(yǔ)句來(lái)提供),不應(yīng)該有“事務(wù)”存在。業(yè)務(wù)邏輯層(BLL):業(yè)務(wù)邏輯層是在數(shù)據(jù)訪問(wèn)層和表示層之

3、間進(jìn)行數(shù)據(jù)交換的橋梁,按業(yè)務(wù)需求調(diào)用數(shù)據(jù)訪問(wèn)層中的方法組合,集合了各種業(yè)務(wù)規(guī)則到一個(gè)BLL中,例如通過(guò)條件進(jìn)行判斷的數(shù)據(jù)操作或“事務(wù)”處理。BLL都是以類庫(kù)(ClassLibrary)的形式來(lái)實(shí)現(xiàn)的。表示層(PL):表示層是為客戶提供用于交互的應(yīng)用服務(wù)圖形界面,幫助用戶理解和高效地定位應(yīng)用服務(wù),呈現(xiàn)業(yè)務(wù)邏輯層中傳遞的數(shù)據(jù),用ASP.NET頁(yè)面來(lái)實(shí)現(xiàn)。二.三層架構(gòu)應(yīng)用實(shí)現(xiàn)隨著ASP.NET的不斷升級(jí),可以很方便的使用ASP.NET來(lái)構(gòu)建B/S三層架構(gòu)的應(yīng)用程序,下面以“教師業(yè)務(wù)信息管理系統(tǒng)”項(xiàng)目中的部分例子來(lái)演示如何使用ASP.NET2.0和SQLServer2005數(shù)據(jù)庫(kù)來(lái)構(gòu)建一個(gè)三層架構(gòu)的應(yīng)

4、用程序。創(chuàng)建數(shù)據(jù)庫(kù)打開(kāi)SQLServer2005,新建一個(gè)數(shù)據(jù)庫(kù)“TeacherDb,建立如下所示結(jié)構(gòu)的兩個(gè)表“Personinfo”和“Jobinfo。兩表以PersonlDNumber作為關(guān)聯(lián)字段,存儲(chǔ)18位身份證號(hào)碼。表名:PersonInfo基本信息表字段名類型說(shuō)明備注IDint主鍵,自增UserIDuniqueidentifier登錄帳戶IDTrueNamenvarchar(20)姓名PersonlDNumbernvarchar(18)身份證Sexnvarchar(1)性別“男”或“女”BirthDatedatetime出生日期Nationnvarchar(10)民族NativePl

5、acenvarchar(50)籍貫Politynvarchar(10)政治面貌JoinPolityTimedatetime入黨時(shí)間PersonImageUrlnvarchar(250)相片地址允許NULLTelephonenvarchar(50)聯(lián)系電話MobiePhonenvarchar(50)手機(jī)號(hào)碼Emailnvarchar(50)Email表名:JobInfo職業(yè)信息表字段名類型說(shuō)明備注IDint主鍵,自增PersonIDNumbernvarchar(18)身份證號(hào)碼Postlnvarchar(20)職務(wù)Post2nvarchar(20)職務(wù)2第二職務(wù)JoinTimedatetime參

6、加工作時(shí)間CountryWorkedTimeint農(nóng)村年限MasteSubjectnvarchar(20)學(xué)科SecondSubjectnvarchar(20)兼職學(xué)科SchoolPhasenvarchar(10)學(xué)段MotherClassTimeint班主任年限SchoolIDint所在學(xué)校代碼InPositionreal是否在職創(chuàng)建數(shù)據(jù)訪問(wèn)層在開(kāi)始創(chuàng)建數(shù)據(jù)訪問(wèn)層(DAL)之前,首先需要?jiǎng)?chuàng)建一個(gè)網(wǎng)站,配置好數(shù)據(jù)庫(kù)鏈接。第一步:創(chuàng)建一個(gè)Web項(xiàng)目,配置數(shù)據(jù)庫(kù)連接打開(kāi)VisualStudio2005(以下簡(jiǎn)稱VS2005)集成開(kāi)發(fā)環(huán)境,首先創(chuàng)建一個(gè)C#語(yǔ)言的ASP.NET網(wǎng)站,并將其命名為Web

7、Site,設(shè)置位置(Location)列表的選項(xiàng)為文件系統(tǒng)(FileSystem),然后選這一個(gè)放置這個(gè)網(wǎng)站的文件夾,然后選擇編程語(yǔ)言為C#。VisualStudio會(huì)為你生成一個(gè)新的網(wǎng)站,同時(shí)生成一個(gè)名為Default.aspx的網(wǎng)頁(yè),和一個(gè)App_Data文件夾。第二步:創(chuàng)建數(shù)據(jù)訪問(wèn)層,配置數(shù)據(jù)庫(kù)連接接下來(lái)創(chuàng)建數(shù)據(jù)訪問(wèn)層,添加一個(gè)強(qiáng)類型的DataSet。在解決方案管理器里的項(xiàng)目節(jié)點(diǎn)上按右鼠標(biāo),選擇“添加新項(xiàng)”,在模板列單里選擇“數(shù)據(jù)集”,將其命名為DataSetl.xsd。接下來(lái)會(huì)出現(xiàn)“TableAdpater配置向?qū)У拇翱冢x擇數(shù)據(jù)庫(kù)服務(wù)器,設(shè)置好各項(xiàng)參數(shù),并按照提示逐步完成。需要注意:

8、1指定連接的數(shù)據(jù)庫(kù)字符串,并選擇將連接字符串保存到web.config文件中去。2.命令類型選擇“使用SQL語(yǔ)句”,通過(guò)“高級(jí)選項(xiàng)”選擇“生成Insert、Update和Delete語(yǔ)句”,通過(guò)“查詢生成器”生成要裝載數(shù)據(jù)的“Select語(yǔ)句。并為方法命名。SELECTID,UserID,TrueName,PersonlDNumber,Sex,BirthDate,Nation,NativePlace,Polity,JoinPolityTime,PersonImageUrl,Telephone,MobiePhone,EmailFROMEM_P_PersonInfo針對(duì)項(xiàng)目需求對(duì)數(shù)據(jù)庫(kù)中各表查詢操

9、作分別建立各種方法,完成后的可能如下圖。跟底層數(shù)據(jù)源相關(guān)的所有編碼,比如建立到數(shù)據(jù)庫(kù)的連接,發(fā)出SELECT,INSERT,UPDATE和DELETE命令等的編碼,都應(yīng)該放置在DAL中。表現(xiàn)層不應(yīng)該包含對(duì)這些數(shù)據(jù)訪問(wèn)編碼的任何引用,而應(yīng)該調(diào)用DAL中的編碼處理所有的數(shù)據(jù)訪問(wèn)請(qǐng)求。數(shù)據(jù)訪問(wèn)層包含訪問(wèn)底層數(shù)據(jù)庫(kù)數(shù)據(jù)的方法。至此,清晰構(gòu)建出數(shù)據(jù)訪問(wèn)層,之后可在“業(yè)務(wù)邏輯層”和“表示層”通過(guò)調(diào)用自動(dòng)生成的TableAdpater及相關(guān)類來(lái)操作數(shù)據(jù)。由于“數(shù)據(jù)集”是強(qiáng)類型,對(duì)于數(shù)據(jù)庫(kù)中的NULL數(shù)據(jù)需要使用方法來(lái)判斷,這些內(nèi)容在后續(xù)內(nèi)容中再詳細(xì)描述。創(chuàng)建業(yè)務(wù)邏輯層數(shù)據(jù)訪問(wèn)層(DAL)將數(shù)據(jù)訪問(wèn)的細(xì)節(jié)從表

10、示層中分離出來(lái)了,可它卻不能處理任何的業(yè)務(wù)規(guī)則。比如判斷數(shù)據(jù)的有效性。這些工作將由業(yè)務(wù)邏輯層(簡(jiǎn)稱BLL)來(lái)承擔(dān),在以下應(yīng)用程序中,將BLL實(shí)現(xiàn)為App_Code文件夾中的一系列的類。每一個(gè)BLL類都對(duì)應(yīng)DAL中的一個(gè)TableAdapter,它們都從各自的TableAdapter中得到讀取、插入、修改以及刪除等方法以應(yīng)用合適的業(yè)務(wù)規(guī)則。第一步:創(chuàng)建BLL類在App_Code文件夾中創(chuàng)建2個(gè)類文件。在解決方案瀏覽器(SolutionExplorer)中右鍵點(diǎn)擊App_Code文件夾,并選擇新建項(xiàng)目(NewItem),然后在彈出的對(duì)話框中選擇“類”模板(Classtemplate)就可以創(chuàng)建新的

11、類文件了。將這2個(gè)文件分別命名為UserBLL以及JobBLL。齋決方案資謖管理蠱App暫暫暫超暫暫暫暫暫暫暫暫暫暫暫暫暫暫國(guó)暫曹rcLrcLrcLrLMCLrcLrcLrcLrcLrcLrcLrcLrcLrcLrcLrcLrcLrcLrLrcLrcL皤丨證園匾I龜AiiiTiirLEELL.cskrticleBLL.ceCmttiicateBLL.ceClaEsDiagi_:=uTi.cdDictiDTLSQ-y.ceEx:=uTiirLeBLL.ceHorLorELL.csJubBLL.CEM:=LTLagerBLL.ceFerEonllLcsFei_sorLJLeEijiTieELL.c

12、eFei_sonUrLCei_tiedBLL.cFei_sonUrLCei_tieiLie+BLL.FroduetiunliLL.csReEe:=LfclLEsLL.ceSchoolELL.csStudyDegi_eeBLL.ceStudyReEijiTieBLL.ceTeacher,xsdTrainJlLL.csUserELL.ce第二步:通過(guò)BLL類訪問(wèn)類型化數(shù)據(jù)集為UserBLL和JobBLL類分別添加如下方法:UserBLL.cssupdateuser(stringUserName,StringPersonlDNumber,intSchoolID,stringPassword,stri

13、ngSex,stringTrueName,boolInPosition)updateUser(StringPersonIDNumber,stringTrueName,stringBirthDate,stringNation,stringNativePlace,stringPolity,stringJoinPolityTime,stringTelephone,stringMobiePhone,stringEmail)getPersons(intSchoolID,stringTrueName)getPersonByPiD(stringPersonIDNumber)deleteUser(string

14、UserName,StringPersonIDNumber,int?SchoolID)addUser(stringUserName,StringPersonIDNumber,intSchoolID,stringPassword,stringSex,stringTrueName,boolInPosition)JobBLL.cssgetPersonJob(stringPersonIDNumber)updateUser(StringPersonIDNumber,stringPost1,stringPost2,stringJoinTime,int?CountryWorkedTime,stringMas

15、teSubject,stringSecondSubject,stringSchoolPhase,int?MotherClassTime)以下為JobBLL.css的代碼(UserBLL.css的代碼太長(zhǎng),不列出)usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSys

16、tem.Web.UI.HtmlControls;usingTeacherTableAdapters;/summary/JobBLL的摘要說(shuō)明/summarySystem.ComponentModel.DataObjectpublicclassJobBLLprivateJobInfoTableAdapter_JobAdapter=null;publicJobBLL()/TODO:在此處添加構(gòu)造函數(shù)邏輯/protectedJobInfoTableAdapterAdaptergetif(_JobAdapter=null)_JobAdapter=newJobInfoTableAdapter();ret

17、urn_JobAdapter;/selectSystem.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,false)publicTeacher.JobInfoDataTablegetPersonjob(stringPersonIDNumber)returnAdapter.GetPersonJobByPID(PersonIDNumber);/updateSystem.ComponentModel.DataObjectMethodAttribute(System.

18、ComponentModel.DataObjectMethodType.Update,false)publicboolupdateUser(StringPersonIDNumber,stringPost1,stringPost2,stringJoinTime,int?CountryWorkedTime,stringMasteSubject,stringSecondSubject,stringSchoolPhase,int?MotherClassTime)if(string.IsNullOrEmpty(PersonIDNumber)returnfalse;tryTeacher.JobInfoDa

19、taTablePersonJob=Adapter.GetPersonJobByPID(PersonIDNumber);Teacher.JobInfoRowPersonJobPID;if(PersonJob.Count二二1)PersonJobPID=PersonJob0;elsereturnfalse;if(!string.IsNullOrEmpty(Postl)PersonJobPID.Postl二Postl;elsePersonJobPID.SetPost1Null();if(!string.IsNullOrEmpty(Post2)PersonJobPID.Post2=Post2;else

20、PersonJobPID.SetPost2Null();if(!string.IsNullOrEmpty(MasteSubject)PersonJobPID.MasteSubject二MasteSubject;elsePersonJobPID.SetMasteSubjectNull();if(!string.IsNullOrEmpty(SecondSubject)PersonJobPID.SecondSubject二SecondSubject;elsePersonJobPID.SetSecondSubjectNull();if(!string.IsNullOrEmpty(SchoolPhase

21、)PersonJobPID.SchoolPhase=SchoolPhase;elsePersonJobPID.SetSchoolPhaseNull();if(!(CountryWorkedTime=null)dTime.Value;e.Value;PersonJobPID.CountryWorkedTime=CountryWorkeelsePersonJobPID.SetCountryWorkedTimeNull();if(!(MotherClassTime=null)PersonJobPID.MotherClassTime=MotherClassTimelsePersonJobPID.Set

22、MotherClassTimeNull();if(!string.IsNullOrEmpty(JoinTime)PersonJobPID.JoinTime=DateTime.Parse(JoinTime);elsePersonJobPID.SetjoinTimeNull();introwAffectl二Adapter.Update(PersonJobPID);return(rowAffect1二二1);catch(System.Configuration.Provider.ProviderExceptione)returnfalse;說(shuō)明:usingTeacherTableAdapters;引

23、用DAL層命名空間,自動(dòng)生成,必須。否則無(wú)法使用類。JoblnfoTableAdapter類,對(duì)應(yīng)DAL中的TableAdapter適配器Jobinfo,通過(guò)這個(gè)類來(lái)調(diào)用增、刪及改等數(shù)據(jù)操作。使用JobInfoDataTablePersonjob來(lái)裝載查詢返回的數(shù)據(jù),是DataSet中的強(qiáng)類型數(shù)據(jù)表,結(jié)構(gòu)和數(shù)據(jù)類型由數(shù)據(jù)庫(kù)定義。使用JobInfoRowPersonJobPID來(lái)載入表中的某一行。行字段訪問(wèn)用如下形式:Row變量字段名(如PersonJobPID.Postl)。Teacher.JobInfoDataTablePersonJob=Adapter.GetPersonJobByPID(

24、PersonlDNumber);Teacher.JobInfoRowPersonJobPID=PersonJob0;數(shù)據(jù)庫(kù)中某些表字段在設(shè)計(jì)時(shí)可能被允許空值(null),強(qiáng)類型DataTable中對(duì)字段的判空與賦空值不能采用以下形式:!string.IsNullOrEmpty(PersonJobPID.Postl)PersonJobPID.Postl=null;PersonJobPID.Postl=null;正確的做法是采用行類型變量(Teacher.JobInfoRowPersonJobPID)為每個(gè)字段生成的“空值方法”操作:voidPersonJobPID.SetPost1Null();

25、boolPersonJobPID.IsPost1Null()JobInfoDataTable或JobInfoRow中數(shù)據(jù)存儲(chǔ)在內(nèi)存中,修改后的數(shù)據(jù)要反映到數(shù)據(jù)庫(kù)中采用適配器方法Update().introwAffectl二Adapter.Update(PersonJobPID);至此業(yè)務(wù)邏輯層構(gòu)建完成。4表示層_使用ObjectDataSource展現(xiàn)數(shù)據(jù)在完成應(yīng)用程序架構(gòu)后,我們可以實(shí)現(xiàn)多種報(bào)表展現(xiàn)。ASP.NET2.0的數(shù)據(jù)源控件提供了一種新的方式,使用這些控件可以輕松的從創(chuàng)建的業(yè)務(wù)邏輯層中進(jìn)行數(shù)據(jù)綁定,甚至不需要手寫(xiě)一行的代碼。ASP.NET2.0提供了五種內(nèi)置的數(shù)據(jù)源控件:SqlDat

26、aSource、AccessDataSource,、ObjectDataSource、XmlDataSource、和SiteMapDataSource。基于已有的業(yè)務(wù)邏輯類我們將使用ObjectDataSource。ObjectDataSource充當(dāng)別的對(duì)象的代理。通過(guò)配置ObjectDataSource,我們指定這些底層的對(duì)象,還有這些對(duì)象的方法如何映射到ObjectDataSource的Select、Insert、Update和Delete方法。一旦底層的對(duì)象被指定并且其方法映射到ObjectDataSource的方法后,我們就可以把ObjectDataSource綁定到頁(yè)面上的DataWeb服務(wù)器控件。ASP.NET提供了許多DataWeb服務(wù)器控件,包括GridView、DetailsView、RadioButtonList和DropDownList等等。在頁(yè)面的生命周期中,DataWeb服務(wù)器控件可能需要訪問(wèn)它所綁定的數(shù)據(jù),這將通過(guò)調(diào)用ObjectDataSource的Select方法來(lái)實(shí)現(xiàn);如果這個(gè)DataWeb服務(wù)器控件還支持插入、更新或者刪除,那么將調(diào)用ObjectDataSource的Insert、Update或者Delete方法。這些調(diào)用會(huì)通過(guò)ObjectDataSource被發(fā)送到適當(dāng)?shù)牡讓訉?duì)象的方法。第一步:添加和配置ObjectData

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論