NETPetShop和Duwamish簡(jiǎn)單介紹_第1頁(yè)
NETPetShop和Duwamish簡(jiǎn)單介紹_第2頁(yè)
NETPetShop和Duwamish簡(jiǎn)單介紹_第3頁(yè)
NETPetShop和Duwamish簡(jiǎn)單介紹_第4頁(yè)
NETPetShop和Duwamish簡(jiǎn)單介紹_第5頁(yè)
已閱讀5頁(yè),還剩5頁(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、.NET PetShop和Duwamish簡(jiǎn)單介紹相信大家一定聽(tīng)說(shuō)過(guò)有名的寵物店大戰(zhàn),沒(méi)錯(cuò),本文的主角之一就是獲勝方.NET PetShop,微軟號(hào)稱以27倍的速度和1/4的代碼量遙遙領(lǐng)先于基于J2EE的PetStore寵物商店。雖然SUN也曾對(duì)此抱怨過(guò)不滿,指責(zé)此大戰(zhàn)有水分,不過(guò)無(wú)論如何,.NET PetShop絕對(duì)是一個(gè)經(jīng)典的.NET實(shí)例教程,至少為我們提供了一條趕超J2EE的“捷徑”!.NET PetShop寵物網(wǎng)上商店首頁(yè) Samples目錄下找到并安裝它,例如:C:Program FilesMicrosoft Visual Studio .NETEnterprise SamplesD

2、uwamish 7.0 CS。 Duwamish網(wǎng)上電子書(shū)店首頁(yè)一、結(jié)構(gòu)簡(jiǎn)述兩家商店都采用了n層應(yīng)用結(jié)構(gòu)(毫無(wú)疑問(wèn),n層結(jié)構(gòu)的應(yīng)用架構(gòu)應(yīng)該絕對(duì)是您開(kāi)發(fā).NET應(yīng)用的首選,哪怕您只想做一個(gè)網(wǎng)頁(yè)計(jì)數(shù)器),不同的是,PetShop采用的是最常見(jiàn)的三層應(yīng)用結(jié)構(gòu),分別為表示層,中間層和數(shù)據(jù)層。而Duwamish則采用的是一個(gè)四層應(yīng)用結(jié)構(gòu),并使用不同的項(xiàng)目分隔開(kāi),分別為表示層,業(yè)務(wù)外觀層,業(yè)務(wù)規(guī)則層和數(shù)據(jù)層。至于這兩種結(jié)構(gòu)分別有什么優(yōu)點(diǎn)和缺點(diǎn),以及為什么要這么分層,我們不進(jìn)行詳細(xì)討論,我們主要分析的是他們的編程的模式。 .NET Pet Shop結(jié)構(gòu)分析:.NET Pet Shop按照三層的分層模型來(lái)部署

3、整個(gè)系統(tǒng)。.NET Pet Shop分為數(shù)據(jù)展示層,中間層,數(shù)據(jù)層。數(shù)據(jù)展示層主要是完成界面和與最終用戶交互的功能,在應(yīng)用程序里面是一些aspx的頁(yè)面和代碼。中間層用于封裝商業(yè)邏輯和規(guī)則,在應(yīng)用程序里面被封裝為.NET組件。數(shù)據(jù)訪問(wèn)層通過(guò)中間層中的數(shù)據(jù)訪問(wèn)組件與SQL Server Provider交互,所有的數(shù)據(jù)獲取依靠存儲(chǔ)過(guò)程來(lái)進(jìn)行,而不是通過(guò)SQL語(yǔ)句。 Duwamish結(jié)構(gòu)分析:Duwamish 7.0 是一個(gè)典型的N層架構(gòu),其結(jié)構(gòu)分為四個(gè)邏輯層: Web 層 Web 層為客戶端提供對(duì)應(yīng)用程序的訪問(wèn)。這一層是作為 Duwamish.sln 解決方案文件中的 Web 項(xiàng)目實(shí)現(xiàn)的。Web

4、層由 ASP.NET Web 窗體和代碼隱藏文件組成。Web 窗體只是用 HTML 提供用戶操作,而代碼隱藏文件實(shí)現(xiàn)各種控件的事件處理。 業(yè)務(wù)外觀層 業(yè)務(wù)外觀層為 Web 層提供處理帳戶、類別瀏覽和購(gòu)書(shū)的界面。這一層是作為 Duwamish.sln 解決方案文件中的 BusinessFacade 項(xiàng)目實(shí)現(xiàn)的。業(yè)務(wù)外觀層用作隔離層,它將用戶界面與各種業(yè)務(wù)功能的實(shí)現(xiàn)隔離開(kāi)來(lái)。除了低級(jí)系統(tǒng)和支持功能之外,對(duì)數(shù)據(jù)庫(kù)服務(wù)器的所有調(diào)用都是通過(guò)此程序集進(jìn)行的。 業(yè)務(wù)規(guī)則層 業(yè)務(wù)規(guī)則層是作為 Duwamish.sln 解決方案文件中的 BusinessRules 項(xiàng)目實(shí)現(xiàn)的,它包含各種業(yè)務(wù)規(guī)則和邏輯的實(shí)現(xiàn)。業(yè)

5、務(wù)規(guī)則完成如客戶帳戶和書(shū)籍訂單的驗(yàn)證這樣的任務(wù)。 數(shù)據(jù)訪問(wèn)層 數(shù)據(jù)訪問(wèn)層為業(yè)務(wù)規(guī)則層提供數(shù)據(jù)服務(wù)。這一層是作為 Duwamish.sln 解決方案文件中的 DataAccess 項(xiàng)目實(shí)現(xiàn)的。 我們從圖中可以清楚的看到,瀏覽器首先調(diào)用的是表示層WEB,然后WEB將請(qǐng)求發(fā)送給業(yè)務(wù)外觀層,業(yè)務(wù)外觀層對(duì)請(qǐng)求進(jìn)行初步的處理,判斷是否需要調(diào)用業(yè)務(wù)規(guī)則層,還是直接調(diào)用數(shù)據(jù)訪問(wèn)層獲取數(shù)據(jù)。最后由數(shù)據(jù)訪問(wèn)層訪問(wèn)數(shù)據(jù)庫(kù)并按照來(lái)時(shí)的步驟返回結(jié)果到瀏覽器(對(duì)于圖中涉及到其它的結(jié)構(gòu)模塊以后會(huì)分別予以詳細(xì)介紹)。數(shù)據(jù)訪問(wèn)剖析:(1)Duwamish 的數(shù)據(jù)訪問(wèn)剖析:首先,我們來(lái)看看Duwamish書(shū)店,它采用的是Data

6、Adapter和DataSet配合的數(shù)據(jù)存儲(chǔ)模式,所不同的是,它對(duì)DataSet進(jìn)行子類化擴(kuò)展作為數(shù)據(jù)載體,也就是采用定制的DataSet來(lái)進(jìn)行層間的數(shù)據(jù)傳輸,下面是一個(gè)定制的DataSet示例:public class BookData : DataSet public BookData() / / Create the tables in the dataset / BuildDataTables(); private void BuildDataTables() / / Create the Books table / DataTable table = new DataTable(BO

7、OKS_TABLE); DataColumnCollection columns = table.Columns; columns.Add(PKID_FIELD, typeof(System.Int32); columns.Add(TYPE_ID_FIELD, typeof(System.Int32); columns.Add(PUBLISHER_ID_FIELD, typeof(System.Int32); columns.Add(PUBLICATION_YEAR_FIELD, typeof(System.Int16); columns.Add(ISBN_FIELD, typeof(Syst

8、em.String); columns.Add(IMAGE_FILE_SPEC_FIELD, typeof(System.String); columns.Add(TITLE_FIELD, typeof(System.String); columns.Add(DESCRIPTION_FIELD, typeof(System.String); columns.Add(UNIT_PRICE_FIELD, typeof(System.Decimal); columns.Add(UNIT_COST_FIELD, typeof(System.Decimal); columns.Add(ITEM_TYPE

9、_FIELD, typeof(System.String); columns.Add(PUBLISHER_NAME_FIELD, typeof(System.String); 我們可以看到它有一個(gè)BuildDataTables方法,并且在構(gòu)造函數(shù)中調(diào)用,這樣,定制的Books表就和這個(gè)DataSet捆綁在一起了,省得以后還要進(jìn)行Column Mapping。解決了數(shù)據(jù)結(jié)構(gòu),接下來(lái)看看數(shù)據(jù)層的代碼實(shí)現(xiàn),在Duwamish中,數(shù)據(jù)層中有5個(gè)類,分別是Books,Categories,Customers和Orders,每個(gè)類分別只負(fù)責(zé)有關(guān)數(shù)據(jù)的存取。下面是其中一個(gè)類的示例代碼:private Sql

10、DataAdapter dsCommand;public BookData GetBookById(int bookId) return FillBookData(GetBookById, BookId, bookId.ToString();private BookData FillBookData(String commandText, String paramName, String paramValue) if (dsCommand = null ) throw new System.ObjectDisposedException( GetType().FullName ); BookD

11、ata data = new BookData(); SqlCommand command = dsCommand.SelectCommand; command.CommandText = commandText; command.CommandType = CommandType.StoredProcedure; / use stored proc for perf SqlParameter param = new SqlParameter(paramName, SqlDbType.NVarChar, 255); param.Value = paramValue; dsCommand.Fil

12、l(data); return data;這里就是數(shù)據(jù)層的代碼了,我們?cè)谶@里可以看到Duwamish采用了DataAdapter來(lái)將數(shù)據(jù)填充到定制的DataSet中,然后返回該DataSet。我感到很奇怪的是在數(shù)據(jù)存取層中竟然可以看到GetBookById這樣具體的數(shù)據(jù)存取方法,雖然最后還是有一個(gè)抽象出來(lái)的FillBookData方法,但是上面還有三層啊,底層都做到這份上了,那上層都做些什么呢?答案是數(shù)據(jù)檢查,上層基本上都在做一些很?chē)?yán)密的數(shù)據(jù)合法性校驗(yàn)(當(dāng)然也會(huì)包括一些比較復(fù)雜的事務(wù)邏輯,但是并不多),示例代碼如下:public CustomerData GetCustomerByEmail(

13、String emailAddress, String password) / / Check preconditions / ApplicationAssert.CheckCondition(emailAddress != String.Empty, Email address is required,ApplicationAssert.LineNumber); ApplicationAssert.CheckCondition(password != String.Empty, Password is required, ApplicationAssert.LineNumber); / /

14、Get the customer dataSet / CustomerData dataSet; using (DataAccess.Customers customersDataAccess = new DataAccess.Customers() dataSet = customersDataAccess.LoadCustomerByEmail(emailAddress); / / Verify the customers password / DataRowCollection rows = dataSet.TablesCustomerData.CUSTOMERS_TABLE.Rows;

15、 if ( ( rows.Count = 1 ) & rows0CustomerData.PASSWORD_FIELD.Equals(password) ) return dataSet; else return null; 在這個(gè)方法中,真正進(jìn)行數(shù)據(jù)存取的實(shí)際上只有dataSet = customersDataAccess.LoadCustomerByEmail(emailAddress);這么一句,是直接調(diào)用的數(shù)據(jù)層。其它都是在進(jìn)行合法性校驗(yàn),我們可以感悟到,進(jìn)行一個(gè)真正的企業(yè)級(jí)開(kāi)發(fā)需要考慮的系統(tǒng)健壯性有多么重要。(2).NET PetShop數(shù)據(jù)訪問(wèn)剖析PetShop只有一個(gè)項(xiàng)目,它采用

16、的分層辦法是將中間層和數(shù)據(jù)層都寫(xiě)成cs文件放在Components目錄里,其中數(shù)據(jù)層就是一個(gè)名為Database的類,它封裝了所有對(duì)數(shù)據(jù)庫(kù)的底層操作。下面是示例代碼段:public void RunProc(string procName, out SqlDataReader dataReader) SqlCommand cmd = CreateCommand(procName, null);我們看到了一個(gè)跟Duwamish截然不同的另一種數(shù)據(jù)訪問(wèn)方式,它將所有的數(shù)據(jù)訪問(wèn)方法抽象出來(lái)做成一個(gè)RunProc方法,至于返回?cái)?shù)據(jù)呢,呵呵,它有點(diǎn)偷懶,直接返回一個(gè)DataReader給你,你自己去讀吧

17、。還記得Duwamish采用的層間數(shù)據(jù)傳輸載體是什么嗎?對(duì)了,是DataSet,它被數(shù)據(jù)層填充后返回給了中間層。但是這里,數(shù)據(jù)層和傳輸層的數(shù)據(jù)傳輸載體變成了DataReader,實(shí)際上,還不能稱它為數(shù)據(jù)載體,因?yàn)閿?shù)據(jù)還沒(méi)開(kāi)始讀呢,在這里,DataReader的作用和指針有點(diǎn)類似,也許我們應(yīng)該稱它為“數(shù)據(jù)引用”:)接著往下看,DataReader被怎么“處理”的:public ProductResults GetList(string catid, int currentPage, int pageSize, ref int numResults) numResults = 0;int inde

18、x=0;SqlDataReader reader = GetList(catid);ProductResults results = new ProductResultspageSize;/ now loop through the list and pull out items of the specified pageint start = (int)(currentPage - 1) * pageSize);if (start = 0) start = 1;/ skip for (int i = 0; i 1) reader.Read();/ read the data we are i

19、nterested inwhile (reader.Read() if (index pageSize) resultsindex = new ProductResults();ductid = reader.GetString(0); = reader.GetString(1);index+;numResults+; reader.Close();/ see if need to redim arrayif (index = pageSize)return results;else / not a full page, red

20、im arrayProductResults results2 = new ProductResultsindex;Array.Copy(results, results2, index);return results2;注意到currentPage和pageSize了嗎?原來(lái)在這里就進(jìn)行了數(shù)據(jù)分頁(yè),只返回滿足需要的最少的數(shù)據(jù)量,而不是象我們很多喜歡偷懶的人一樣,簡(jiǎn)單的將整個(gè)DataTable一股腦的綁定到DataGrid,造成大量的數(shù)據(jù)冗余。在這里,數(shù)據(jù)被真正的讀出來(lái),并且被手動(dòng)填充到一個(gè)自定義的對(duì)象數(shù)組中,我們來(lái)看看這個(gè)數(shù)組的定義:public class ProductResults p

21、rivate string m_productid;private string m_name;/ product propspublic string productid get return m_productid; set m_productid = value; public string name get return m_name; set m_name = value; 非常之簡(jiǎn)單,不過(guò)我有點(diǎn)奇怪為什么不使用struct呢?是不是.NET中struct和class的性能差距已經(jīng)可以忽略不計(jì)了?分析總結(jié)通過(guò)觀察這兩個(gè)商店的具體實(shí)現(xiàn),我們得到了兩個(gè)不同的數(shù)據(jù)訪問(wèn)模式,Duwamish采用的是以DataSet

溫馨提示

  • 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)論