版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、.NET PetShop和Duwamish簡單介紹相信大家一定聽說過有名的寵物店大戰(zhàn),沒錯(cuò),本文的主角之一就是獲勝方.NET PetShop,微軟號(hào)稱以27倍的速度和1/4的代碼量遙遙領(lǐng)先于基于J2EE的PetStore寵物商店。雖然SUN也曾對此抱怨過不滿,指責(zé)此大戰(zhàn)有水分,不過無論如何,.NET PetShop絕對是一個(gè)經(jīng)典的.NET實(shí)例教程,至少為我們提供了一條趕超J2EE的“捷徑”!.NET PetShop寵物網(wǎng)上商店首頁 Samples目錄下找到并安裝它,例如:C:Program FilesMicrosoft Visual Studio .NETEnterprise SamplesD
2、uwamish 7.0 CS。 Duwamish網(wǎng)上電子書店首頁一、結(jié)構(gòu)簡述兩家商店都采用了n層應(yīng)用結(jié)構(gòu)(毫無疑問,n層結(jié)構(gòu)的應(yīng)用架構(gòu)應(yīng)該絕對是您開發(fā).NET應(yīng)用的首選,哪怕您只想做一個(gè)網(wǎng)頁計(jì)數(shù)器),不同的是,PetShop采用的是最常見的三層應(yīng)用結(jié)構(gòu),分別為表示層,中間層和數(shù)據(jù)層。而Duwamish則采用的是一個(gè)四層應(yīng)用結(jié)構(gòu),并使用不同的項(xiàng)目分隔開,分別為表示層,業(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按照三層的分層模型來部署
3、整個(gè)系統(tǒng)。.NET Pet Shop分為數(shù)據(jù)展示層,中間層,數(shù)據(jù)層。數(shù)據(jù)展示層主要是完成界面和與最終用戶交互的功能,在應(yīng)用程序里面是一些aspx的頁面和代碼。中間層用于封裝商業(yè)邏輯和規(guī)則,在應(yīng)用程序里面被封裝為.NET組件。數(shù)據(jù)訪問層通過中間層中的數(shù)據(jù)訪問組件與SQL Server Provider交互,所有的數(shù)據(jù)獲取依靠存儲(chǔ)過程來進(jìn)行,而不是通過SQL語句。 Duwamish結(jié)構(gòu)分析:Duwamish 7.0 是一個(gè)典型的N層架構(gòu),其結(jié)構(gòu)分為四個(gè)邏輯層: Web 層 Web 層為客戶端提供對應(yīng)用程序的訪問。這一層是作為 Duwamish.sln 解決方案文件中的 Web 項(xiàng)目實(shí)現(xiàn)的。Web
4、層由 ASP.NET Web 窗體和代碼隱藏文件組成。Web 窗體只是用 HTML 提供用戶操作,而代碼隱藏文件實(shí)現(xiàn)各種控件的事件處理。 業(yè)務(wù)外觀層 業(yè)務(wù)外觀層為 Web 層提供處理帳戶、類別瀏覽和購書的界面。這一層是作為 Duwamish.sln 解決方案文件中的 BusinessFacade 項(xiàng)目實(shí)現(xiàn)的。業(yè)務(wù)外觀層用作隔離層,它將用戶界面與各種業(yè)務(wù)功能的實(shí)現(xiàn)隔離開來。除了低級(jí)系統(tǒng)和支持功能之外,對數(shù)據(jù)庫服務(wù)器的所有調(diào)用都是通過此程序集進(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ī)則完成如客戶帳戶和書籍訂單的驗(yàn)證這樣的任務(wù)。 數(shù)據(jù)訪問層 數(shù)據(jù)訪問層為業(yè)務(wù)規(guī)則層提供數(shù)據(jù)服務(wù)。這一層是作為 Duwamish.sln 解決方案文件中的 DataAccess 項(xiàng)目實(shí)現(xiàn)的。 我們從圖中可以清楚的看到,瀏覽器首先調(diào)用的是表示層WEB,然后WEB將請求發(fā)送給業(yè)務(wù)外觀層,業(yè)務(wù)外觀層對請求進(jìn)行初步的處理,判斷是否需要調(diào)用業(yè)務(wù)規(guī)則層,還是直接調(diào)用數(shù)據(jù)訪問層獲取數(shù)據(jù)。最后由數(shù)據(jù)訪問層訪問數(shù)據(jù)庫并按照來時(shí)的步驟返回結(jié)果到瀏覽器(對于圖中涉及到其它的結(jié)構(gòu)模塊以后會(huì)分別予以詳細(xì)介紹)。數(shù)據(jù)訪問剖析:(1)Duwamish 的數(shù)據(jù)訪問剖析:首先,我們來看看Duwamish書店,它采用的是Data
6、Adapter和DataSet配合的數(shù)據(jù)存儲(chǔ)模式,所不同的是,它對DataSet進(jìn)行子類化擴(kuò)展作為數(shù)據(jù)載體,也就是采用定制的DataSet來進(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),接下來看看數(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ù)層的代碼了,我們在這里可以看到Duwamish采用了DataAdapter來將數(shù)據(jù)填充到定制的DataSet中,然后返回該DataSet。我感到很奇怪的是在數(shù)據(jù)存取層中竟然可以看到GetBookById這樣具體的數(shù)據(jù)存取方法,雖然最后還是有一個(gè)抽象出來的FillBookData方法,但是上面還有三層啊,底層都做到這份上了,那上層都做些什么呢?答案是數(shù)據(jù)檢查,上層基本上都在做一些很嚴(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í)開發(fā)需要考慮的系統(tǒng)健壯性有多么重要。(2).NET PetShop數(shù)據(jù)訪問剖析PetShop只有一個(gè)項(xiàng)目,它采用
16、的分層辦法是將中間層和數(shù)據(jù)層都寫成cs文件放在Components目錄里,其中數(shù)據(jù)層就是一個(gè)名為Database的類,它封裝了所有對數(shù)據(jù)庫的底層操作。下面是示例代碼段:public void RunProc(string procName, out SqlDataReader dataReader) SqlCommand cmd = CreateCommand(procName, null);我們看到了一個(gè)跟Duwamish截然不同的另一種數(shù)據(jù)訪問方式,它將所有的數(shù)據(jù)訪問方法抽象出來做成一個(gè)RunProc方法,至于返回?cái)?shù)據(jù)呢,呵呵,它有點(diǎn)偷懶,直接返回一個(gè)DataReader給你,你自己去讀吧
17、。還記得Duwamish采用的層間數(shù)據(jù)傳輸載體是什么嗎?對了,是DataSet,它被數(shù)據(jù)層填充后返回給了中間層。但是這里,數(shù)據(jù)層和傳輸層的數(shù)據(jù)傳輸載體變成了DataReader,實(shí)際上,還不能稱它為數(shù)據(jù)載體,因?yàn)閿?shù)據(jù)還沒開始讀呢,在這里,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了嗎?原來在這里就進(jìn)行了數(shù)據(jù)分頁,只返回滿足需要的最少的數(shù)據(jù)量,而不是象我們很多喜歡偷懶的人一樣,簡單的將整個(gè)DataTable一股腦的綁定到DataGrid,造成大量的數(shù)據(jù)冗余。在這里,數(shù)據(jù)被真正的讀出來,并且被手動(dòng)填充到一個(gè)自定義的對象數(shù)組中,我們來看看這個(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; 非常之簡單,不過我有點(diǎn)奇怪為什么不使用struct呢?是不是.NET中struct和class的性能差距已經(jīng)可以忽略不計(jì)了?分析總結(jié)通過觀察這兩個(gè)商店的具體實(shí)現(xiàn),我們得到了兩個(gè)不同的數(shù)據(jù)訪問模式,Duwamish采用的是以DataSet
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度出租車企業(yè)智能化升級(jí)股權(quán)合作協(xié)議4篇
- 2025年度老舊小區(qū)改造升級(jí)物業(yè)服務(wù)合同4篇
- 二零二五年度高考沖刺家教合同樣本3篇
- 2025年度大米冷鏈物流配送合同二零二五年度4篇
- 2025年度個(gè)人帶車庫帶健身房別墅買賣合同書4篇
- 二零二五年度危化品臨時(shí)運(yùn)輸合同4篇
- 2025年度大型工業(yè)廠房除塵設(shè)施改造合同4篇
- 二零二五年度大米種植保險(xiǎn)與風(fēng)險(xiǎn)規(guī)避合作協(xié)議4篇
- 2025年度代收款服務(wù)與信用評(píng)估合作合同范本4篇
- 2025年度公共設(shè)施裝修設(shè)計(jì)與施工一體化合同范本3篇
- GB/T 12723-2024單位產(chǎn)品能源消耗限額編制通則
- 2024年廣東省深圳市中考英語試題含解析
- GB/T 16288-2024塑料制品的標(biāo)志
- 麻風(fēng)病防治知識(shí)課件
- 建筑工程施工圖設(shè)計(jì)文件審查辦法
- 干部職級(jí)晉升積分制管理辦法
- 培訓(xùn)機(jī)構(gòu)應(yīng)急預(yù)案6篇
- 北師大版數(shù)學(xué)五年級(jí)上冊口算專項(xiàng)練習(xí)
- 應(yīng)急物資智能調(diào)配系統(tǒng)解決方案
- 2025年公務(wù)員考試時(shí)政專項(xiàng)測驗(yàn)100題及答案
- TSG ZF003-2011《爆破片裝置安全技術(shù)監(jiān)察規(guī)程》
評(píng)論
0/150
提交評(píng)論