基于.NET平臺的分層架構(gòu)實戰(zhàn)_第1頁
基于.NET平臺的分層架構(gòu)實戰(zhàn)_第2頁
基于.NET平臺的分層架構(gòu)實戰(zhàn)_第3頁
基于.NET平臺的分層架構(gòu)實戰(zhàn)_第4頁
基于.NET平臺的分層架構(gòu)實戰(zhàn)_第5頁
已閱讀5頁,還剩69頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于.NET平臺的分層架構(gòu)實戰(zhàn)(一)綜述通過瀏覽博客園的文章發(fā)現(xiàn),很多朋友對分層架構(gòu)特別感興趣,剛好我剛做完的畢業(yè)設(shè)計就是專門研究.NET平臺上分層架構(gòu)的(題目叫“基于.NET平臺的分層架構(gòu)與設(shè)計模式應(yīng)用研究”)。通過做這篇論文,我對分層架構(gòu)有了一定的了解,所以,就萌發(fā)了想寫一個文章系列,詳述一下分層架構(gòu)。然而,論文的理論性太強,不適合在網(wǎng)上發(fā)布,尤其不適合初學者理解,所以,我想在這個文章系列中,少講理論,而是通過做一個完整的案例來討論分層架構(gòu)的基本方法,這樣會直觀很多。希望在這個文章系列的寫作過程中,能和朋友們一起學習,一起進步。為了讓朋友們把主要精力放在理解分層架構(gòu)而不是案例本身,我準備選

2、擇一個相對簡單的留言本系統(tǒng)作為Demo,這個系統(tǒng)的名字就叫做NGuestBook。初步計劃將這個文章系列分為以下幾篇:1.綜述2.系統(tǒng)需求分析與數(shù)據(jù)庫設(shè)計3.架構(gòu)概要設(shè)計4.實體類的實現(xiàn)5.接口的設(shè)計與實現(xiàn)6.依賴注入與IoC的設(shè)計與實現(xiàn)7.數(shù)據(jù)訪問層的第一種實現(xiàn)Access+動態(tài)生成SQL語言8.數(shù)據(jù)訪問層的第二種實現(xiàn)SQLServer+存儲過程9.數(shù)據(jù)訪問層的第三種實現(xiàn)基于NBear框架的ORM實現(xiàn)10.業(yè)務(wù)邏輯層的實現(xiàn)11.表示層的實現(xiàn)當然,以上只是初步計劃,在寫文章的過程中可能會根據(jù)具體情況適當調(diào)整,但是容大體就是這些。這個文章系列不會對所用到的技術(shù)進行詳細講解,具體請參考相關(guān)文獻,閱

3、讀文章前最好能對以下技術(shù)有一個了解:1.C#語言2.ASP.NET3.設(shè)計模式4.關(guān)系數(shù)據(jù)庫基礎(chǔ)知識5.軟件架構(gòu)基本原則與軟件工程基礎(chǔ)知識6.基于NBear框架的ORM技術(shù)7.JavaScript,Ajax8.ASP.NET AJAX框架(特別是客戶端編程)9.HTML,CSS,標準化布局另外,本文章系列是基于.NET framework2.0框架平臺進行討論,3.5平臺的新特性(如LINQ、ASP.NET MVC等)不會討論,IDE使用Visual Studio 2005,數(shù)據(jù)庫會用到SQLServer2005 Express和Access2003?;?NET平臺的分層架構(gòu)實戰(zhàn)(二)需求分

4、析與數(shù)據(jù)庫設(shè)計在實際的項目中,需求分析和數(shù)據(jù)庫的設(shè)計是很重要的一個環(huán)節(jié),這個環(huán)節(jié)會直接影響項目的開發(fā)過程和質(zhì)量。實際中,這個環(huán)節(jié)不但需要系統(tǒng)分析師、軟件工程師等計算機方面的專家,還需要相關(guān)領(lǐng)域的領(lǐng)域?qū)<覅⑴c才能完成。但是,在這個文章系列中,所要使用的Demo僅僅是一個例子,而且其業(yè)務(wù)極為簡單,因此,這里并不是真正的需求分析和數(shù)據(jù)庫設(shè)計,而是將Demo的需求和數(shù)據(jù)庫羅列至此,使朋友們對Demo有一個大體的了解,方便后續(xù)文章中開發(fā)過程的理解。需求分析:這個項目是一個留言本,其業(yè)務(wù)極為簡單,現(xiàn)將其描述如下。1.任何訪問者可以進行留言,留言完成后,不會立即顯示正文,而是要經(jīng)過管理員驗證后才可顯示。2.

5、任何訪問者可以對留言發(fā)表評論,未通過驗證的留言不可以評論。3.管理員可以對留言進行回復(fù)(這個回復(fù)不同于評論,是直接顯示在正文下面,而且是一個留言只能有一個回復(fù)),并可對留言與評論實行刪除,以與對留言進行通過驗證操作。4.管理員分為超級管理員和普通管理員。超級管理員只有一個,負責對普通管理員實行添加、刪除操作。普通管理員可偶多個,負責對留言的管理,并可以修改自己的登錄密碼。這個項目的用例圖如下:圖2.1、NGuestBook的用例圖數(shù)據(jù)庫設(shè)計:設(shè)計數(shù)據(jù)表之前,首先進行實體和關(guān)系的識別與確定。通過需求分析,可以觀察得出,本項目的實體有:管理員(不包括超級管理員),留言,評論。本項目的關(guān)系有:留言與

6、評論間的一對多關(guān)系。進一步,數(shù)據(jù)庫各表的設(shè)計如下:管理員表(TAdmin)ID    int    管理員ID    NotNull    主鍵,自增Name    varchar(20)    登錄名    NotNullPassword    varchar(50)    登錄密碼    Not

7、Null    使用MD5加密留言表(TMessage)ID    int    留言ID    NotNull    主鍵,自增GuestName    varchar(20)    留言者用戶名    NotNullGuestEmail    varchar(100)    留言者E-mail&

8、#160;   NullContent    text    留言容    NotNullTime    datetime    發(fā)表留言時間    NotNull    Reply    text    回復(fù)    NullIsPass  

9、0; varchar(10)    是否通過驗證    NotNull評論表(TComment)ID    int    評論ID    NotNull    主鍵,自增Content    text    評論容    NotNullTime    datetime 

10、   發(fā)表評論時間    NotNullMessageID    int    所屬留言的ID    外鍵基于.NET平臺的分層架構(gòu)實戰(zhàn)(三)架構(gòu)概要設(shè)計本文主要是對將要實現(xiàn)的架構(gòu)進行一個總體的描述,使朋友們對這個架構(gòu)有個宏觀上的認識。這篇文章理論性的東西會偏多一點,從下篇開始,將進行實際項目的開發(fā)。這篇文章的許多容摘自我的畢業(yè)論文。架構(gòu)基本原則:這里,將描述一些在這個架構(gòu)設(shè)計中的基本原則,其中很多都是經(jīng)典的設(shè)計原則,不過針對分層架構(gòu)的特點,用我自己的語言

11、進行了描述。其中也有我自己提出的原則。逐層調(diào)用原則與單向調(diào)用原則現(xiàn)在約定將N層架構(gòu)的各層依次編號為1、2、K、N-1、N,其中層的編號越大,則越處在上層。那么,我們設(shè)計的架構(gòu)應(yīng)該滿足以下兩個原則:1.第K(1<K<=N)層只準依賴第K-1層,而不可依賴其他底層。2.如果P層依賴Q層,則P的編號一定大于Q。其中第一個原則,保證了依賴的逐層性,與整個架構(gòu)的依賴是逐層向下的,而不能跨層依賴。第二個原則,則保證了依賴的單向性,與只能上層依賴底層,而不能底層反過來依賴上層。針對接口編程,而不是針對實現(xiàn)編程這里所指的接口,不是特指編程語言中的具體語言元素(如C#中由Interface定義的語言

12、接口),而是指一種抽象的,在語義層面上起著接合作用語義體。它的具體實現(xiàn),可能是接口,可能是抽象類,甚至可能是具體類。我認為,從不同的視角,接口可以有以下兩種定義:1.接口是一組規(guī)則的集合,它規(guī)定了實現(xiàn)本接口的類或接口必須擁有的一組規(guī)則。體現(xiàn)了自然界“如果你是則必須能”的理念。2.接口是在一定粒度視圖上同類事物的抽象表示。注意這里我強調(diào)了在一定粒度視圖上,因為“同類事物”這個概念是相對的,它因為粒度視圖不同而不同。具體到N層架構(gòu)中,針對接口編程的意義在部分上是這樣的:現(xiàn)仍約定將N層架構(gòu)的各層依次編號為1、2、K、N-1、N,其中層的編號越大,則越處在上層,那么第K層不應(yīng)該依賴具體一個K-1層,而

13、應(yīng)該依賴一個K-1層的接口,即在第K層中不應(yīng)該有K-1層中的某個具體類。依賴倒置原則在軟件設(shè)計原則中,有一種重要的思想叫做依賴倒置。它的核心思想是:不能讓高層組件依賴底層組件,而且,不管高層組件和底層組件,兩者都應(yīng)依賴于抽象。那么,這個原則和我們上面的原則是否矛盾呢?其實并不矛盾。因為這個原則定義中的“依賴”是指“具體依賴”,而上面定義中的依賴全部指“抽象依賴”。我對這兩種依賴的定義如下:具體依賴如果P層中有一個或一個以上的地方實例化了Q層中某個具體類,則說P層具體依賴于Q層。抽象依賴如果P層沒有實例化Q層中的具體類,而是在一個或一個以上的地方實例化了Q層中某個接口,則說P層抽象依賴于Q層,也

14、叫接口依賴于Q層。從這兩個定義可以看到,所謂的依賴倒置原則,正是上面提到針對接口編程,而不是針對實現(xiàn)編程,兩者在本質(zhì)上是統(tǒng)一的。綜上所述,可以看出,本課題設(shè)計的分層架構(gòu),應(yīng)該是這樣一種架構(gòu):1.N層架構(gòu)的各層依次編號為1、2、K、N-1、N,其中層的編號越大,則越處在上層。2.架構(gòu)中僅存在一種依賴,即第K層接口依賴第K-1層,其中1<K<=N。封裝變化原則封裝變化的原則定義為:找出應(yīng)用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混雜在一起。開放-關(guān)閉原則開發(fā)-關(guān)閉原則定義為:對擴展開放,對修改關(guān)閉。具體到N層架構(gòu)中,可以描述為:當某一層有了一個新的具體實現(xiàn)時,它應(yīng)

15、該可以在不修改其他層的情況下,與此新實現(xiàn)無縫連接,順利交互。單一歸屬原則在這個架構(gòu)中,任何一個操作類都應(yīng)該有單一的職責,屬于單獨的一層,而不能同時擔負兩種職責或?qū)儆诙鄠€層次(實體類與輔助類可以被多個層使用,但它們不屬于任何一個層,而是獨立存在)。層次劃分:目前,典型的分層架構(gòu)是三層架構(gòu),即自底向上依次是數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層和表示層。這種經(jīng)典架構(gòu)經(jīng)歷了時間的考驗和實踐的多次檢驗,被認為是合理、有效的分層設(shè)計,所以,在本文中,將沿襲這種經(jīng)典架構(gòu),使用數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層和表示層的三層架構(gòu)體系。職責劃分:目前,在典型的三層架構(gòu)中,對層次各自的職責劃分并沒有一個統(tǒng)一的規(guī),綜合現(xiàn)有的成功實踐和.NE

16、T平臺的特殊性,在本文中將三層架構(gòu)的職責劃分如下:數(shù)據(jù)訪問層負責與數(shù)據(jù)源的交互,即數(shù)據(jù)的插入、刪除、修改以與從數(shù)據(jù)庫中讀出數(shù)據(jù)等操作。對數(shù)據(jù)的正確性和有效性不負責,對數(shù)據(jù)的用途不了解,不負擔任何業(yè)務(wù)邏輯。業(yè)務(wù)邏輯層負責系統(tǒng)領(lǐng)域業(yè)務(wù)的處理,負責邏輯性數(shù)據(jù)的生成、處理與轉(zhuǎn)換。對流入的邏輯性數(shù)據(jù)的正確性與有效性負責,對流出的邏輯性數(shù)據(jù)與用戶性數(shù)據(jù)不負責,對數(shù)據(jù)的呈現(xiàn)樣式不負責。表示層負責接收用戶的輸入、將輸出呈現(xiàn)給用戶以與訪問安全性驗證。對流入的數(shù)據(jù)的正確性和有效性負責,對呈現(xiàn)樣式負責,對流出的數(shù)據(jù)正確性不負責,但負責在數(shù)據(jù)不正確時給出相應(yīng)的異常信息。模塊劃分與交互設(shè)計:綜合以上分析,可在宏觀上將整

17、個系統(tǒng)分為一下幾個模塊:實體類模塊一組實體類的集合,負責整個系統(tǒng)中數(shù)據(jù)的封裝與傳遞。數(shù)據(jù)訪問層接口族一組接口的集合,表示數(shù)據(jù)訪問層的接口。業(yè)務(wù)邏輯層接口族一組接口的集合,表示業(yè)務(wù)邏輯層的接口。數(shù)據(jù)訪問層模塊一組類的集合,完成數(shù)據(jù)訪問層的具體功能,實現(xiàn)數(shù)據(jù)訪問層接口族。業(yè)務(wù)邏輯層模塊一組類的集合,完成業(yè)務(wù)邏輯層的具體功能,實現(xiàn)業(yè)務(wù)邏輯層接口族。表示層模塊程序與可視元素的集合,負責完成表示層的具體功能。IoC容器模塊負責依賴注入的實現(xiàn)。輔助類模塊完成全局輔助性功能。各模塊間交互關(guān)系如下:圖3.1、總體架構(gòu)圖基于.NET平臺的分層架構(gòu)實戰(zhàn)(四)實體類的設(shè)計與實現(xiàn)實體類是現(xiàn)實實體在計算機中的表示。它貫

18、穿于整個架構(gòu),負擔著在各層次與模塊間傳遞數(shù)據(jù)的職責。一般來說,實體類可以分為“貧血實體類”和“充血實體類”,前者僅僅保存實體的屬性,而后者還包含一些實體間的關(guān)系與邏輯。我們在這個Demo中用的實體類將是“貧血實體類”。大多情況下,實體類和數(shù)據(jù)庫中的表(這里指實體表,不包括表示多對多對應(yīng)的關(guān)系表)是一一對應(yīng)的,但這并不是一個限制,在復(fù)雜的數(shù)據(jù)庫設(shè)計中,有可能出現(xiàn)一個實體類對應(yīng)多個表,或者交叉對應(yīng)的情況。在本文的Demo中,實體類和表是一一對應(yīng)的,并且實體類中的屬性和表中的字段也是對應(yīng)的。在看實體類的代碼前,先看一下系統(tǒng)的工程結(jié)構(gòu)。圖4.1、工程結(jié)構(gòu)圖如上圖所示,在初始階段,整個系統(tǒng)包括6個工程,

19、它們的職責是這樣的:Web表示層Entity存放實體類Factory存放和依賴注入與IoC相關(guān)的類IBLL存放業(yè)務(wù)邏輯層接口族IDAL存放數(shù)據(jù)訪問層接口族Utility存放各種工具類與輔助類這只是一個初期架構(gòu),主要是將整個系統(tǒng)搭一個框架,在后續(xù)開發(fā)中,將會有其他工程被陸陸續(xù)續(xù)添加進來。我們的實體類將放在Entity工程下,這里包括三個文件:AdminInfo.cs,MessageInfo.cs,CommentInfo.cs,分別是管理員實體類、留言實體類和評論實體類。具體代碼如下:AdminInfo.cs:using System;namespace NGuestBook.

20、Entity    / <summary>    / 實體類-管理員    / </summary>    Serializable    public class AdminInfo            

21、;private int id;        private string name;        private string password;        public int ID       &

22、#160;            get  return this.id;             set  this.id = value;           

23、60;     public string Name                    get  return ;             set&

24、#160;  = value;                 public string Password                    get

25、0; return this.password;             set  this.password = value;             MessageInfo.cs:using System;namespace NGuestBook.Enti

26、ty    / <summary>    / 實體類-留言    / </summary>    Serializable    public class MessageInfo            pr

27、ivate int id;        private string guestName;        private string guestEmail;        private string content;     

28、;   private DateTime time;        private string reply;        private string isPass;        public int ID   &

29、#160;                get  return this.id;             set  this.id = value;       

30、60;         public string GuestName                    get  return this.guestName;        

31、     set  this.guestName = value;                 public string GuestEmail              &#

32、160;     get  return this.guestEmail;             set  this.guestEmail = value;                

33、 public string Content                    get  return this.content;             set  this.conte

34、nt = value;                 public DateTime Time                    get  return 

35、this.time;             set  this.time = value;                 public string Reply      &#

36、160;             get  return this.reply;             set  this.reply = value;         

37、0;       public string IsPass                    get  return this.isPass;           &

38、#160; set  this.isPass = value;             CommentInfo.cs:using System;namespace NGuestBook.Entity    / <summary>    / 實體類-評論   

39、 / </summary>    Serializable    public class CommentInfo            private int id;        private string content

40、;        private DateTime time;        private int message;        public int ID           

41、0;        get  return this.id;             set  this.id = value;                

42、 public string Content                    get  return this.content;             set  this.conte

43、nt = value;                 public DateTime Time                    get  return 

44、this.time;             set  this.time = value;                 public int Message      

45、60;             get  return this.message;             set  this.message = value;         &

46、#160;   大家可以看出,實體類的代碼很簡單,僅僅是負責實體的表示和數(shù)據(jù)的傳遞,不包含任何邏輯性容。下篇將介紹接口的設(shè)計?;?NET平臺的分層架構(gòu)實戰(zhàn)(五)接口的設(shè)計與實現(xiàn)接下來,將進行接口的設(shè)計。這里包括數(shù)據(jù)訪問層接口和業(yè)務(wù)邏輯層接口。在分層架構(gòu)中,接口扮演著非常重要的角色,它不但直接決定了各層中的各個操作類需要實現(xiàn)何種操作,而且它明確了各個層次的職責。接口也是系統(tǒng)實現(xiàn)依賴注入機制不可缺少的部分。本項目的接口設(shè)計將按如下順序進行:1.首先由前文的需求分析,列出主要的UI部分。2.分析各個UI需要什么業(yè)務(wù)邏輯支持,從而確定業(yè)務(wù)邏輯層接口。3.分析業(yè)務(wù)邏輯層接

47、口需要何種數(shù)據(jù)訪問操作,從而確定數(shù)據(jù)訪問層接口。另外,為保證完全的面向?qū)ο筇匦?,接口之間的數(shù)據(jù)傳遞主要靠實體類或?qū)嶓w類集合,禁止使用DataTable等對象傳遞數(shù)據(jù)。由需求分析,列出主要UI需求分析部分,請參看基于.NET平臺的分層架構(gòu)實戰(zhàn)(二)需求分析與數(shù)據(jù)庫設(shè)計 。有需求分析,可以列出系統(tǒng)中主要應(yīng)包括以下UI:UI01主頁面,列出全部的留言與相應(yīng)評論,支持分頁顯示。留言按發(fā)表時間逆序顯示,評論緊跟在相應(yīng)留言下。管理員可以通過相應(yīng)對留言執(zhí)行通過驗證、刪除、回復(fù)以與對評論進行刪除操作。游客可通過相應(yīng)連接進入發(fā)表留言評論頁面。UI02發(fā)表留言頁面,供游客發(fā)表新留言。UI03發(fā)表評論頁面,供游客發(fā)

48、表評論。UI04回復(fù)留言頁面,供管理員回復(fù)留言。UI05管理員登錄頁面。UI06管理員修改個人密碼的頁面。UI07超級管理員登錄后的頁面,主要提供管理員列表??梢酝ㄟ^相應(yīng)將指定管理員刪除。UI08添加新管理員的頁面。UI09操作成功完成后的跳轉(zhuǎn)提示頁面。UI10系統(tǒng)出現(xiàn)異常時顯示友好出錯信息的頁面。由UI識別業(yè)務(wù)邏輯操作UI01:按分頁取得留言,按指定留言取得全部評論,將指定留言通過驗證,將指定留言刪除,將指定評論刪除UI02:添加新留言UI03:添加新評論UI04:回復(fù)留言UI05:管理員登錄UI06:修改管理員密碼UI07:取得全部管理員信息,刪除管理員UI08:添加新管理員經(jīng)過整理,可得

49、以下接口操作:IAdminBLL:Add(添加管理員),Remove(刪除管理員),ChangePassword(修改管理員密碼),Login(管理員登錄),GetAll(取得全部管理員)IMessageBLL:Add(添加留言),Remove(刪除留言),Revert(回復(fù)留言),Pass(將留言通過驗證),GetByPage(按分頁取得留言)ICommentBLL:Add(添加評論),Remove(刪除評論),GetByMessage(按留言取得全部評論)這三個接口文件都放在IBLL工程下,具體代碼如下:IAdminBLL.cs:using System;using S

50、ystem.Collections.Generic;using System.Text;using NGuestBook.Entity;namespace NGuestBook.IBLL    / <summary>    / 業(yè)務(wù)邏輯層接口-管理員    / </summary>    public interface IAdmin

51、BLL            / <summary>        / 添加管理員        / </summary>        / <param na

52、me="admin">新管理員實體類</param>        / <returns>是否成功</returns>        bool Add(AdminInfo admin);        / <summary>  

53、;      / 刪除管理員        / </summary>        / <param name="id">欲刪除的管理員的ID</param>        / <retu

54、rns>是否成功</returns>        bool Remove(int id);        / <summary>        / 修改管理員密碼        / </sum

55、mary>        / <param name="id">欲修改密碼的管理員的ID</param>        / <param name="password">新密碼</param>        / &l

56、t;returns>是否成功</returns>        bool ChangePassword(int id,string password);        / <summary>        / 管理員登錄     

57、   / </summary>        / <param name="name">管理員登錄名</param>        / <param name="password">管理員密碼</param>    &#

58、160;   / <returns>如果登錄成功,則返回相應(yīng)管理員的實體類,否則返回null</returns>        AdminInfo Login(string name,string password);        / <summary>     

59、0;  / 取得全部管理員信息        / </summary>        / <returns>管理員實體類集合</returns>        IList<AdminInfo> GetAll();   &#

60、160;IMessageBLL.cs:using System;using System.Collections.Generic;using System.Text;using NGuestBook.Entity;namespace NGuestBook.IBLL    / <summary>    / 業(yè)務(wù)邏輯層接口-留言    / </summary> 

61、60;  public interface IMessageBLL            / <summary>        / 添加留言        / </summary>    

62、;    / <param name="message">新留言實體類</param>        / <returns>是否成功</returns>        bool Add(MessageInfo message);    

63、60;   / <summary>        / 刪除留言        / </summary>        / <param name="id">欲刪除的留言的ID</param>  

64、;      / <returns>是否成功</returns>        bool Remove(int id);        / <summary>        / 回復(fù)留言  &#

65、160;     / </summary>        / <param name="id">要回復(fù)的留言的ID</param>        / <param name="reply">回復(fù)信息</param>  &

66、#160;     / <returns>是否成功</returns>        bool Revert(int id, string reply);        / <summary>        /&#

67、160;將留言通過驗證        / </summary>        / <param name="id">通過驗證的留言的ID</param>        / <returns>是否成功</returns>  

68、;      bool Pass(int id);        / <summary>        / 按分頁取得留言信息        / </summary>     

69、   / <param name="pageSize">每頁顯示幾條留言</param>        / <param name="pageNumber">當前頁碼</param>        / <returns>留言實體類集合</returns&

70、gt;        IList<MessageInfo> GetByPage(int pageSize,int pageNumber);    ICommentBLL.csusing System;using System.Collections.Generic;using System.Text;using NGuestBook.Entity;namespace NGuestBoo

71、k.IBLL    / <summary>    / 業(yè)務(wù)邏輯層接口-評論    / </summary>    public interface ICommentBLL            / <summary>

72、0;       / 添加評論        / </summary>        / <param name="comment">新評論實體類</param>        / &

73、lt;returns>是否成功</returns>        bool Add(CommentInfo comment);        / <summary>        / 刪除評論        /

74、 </summary>        / <param name="id">欲刪除的評論的ID</param>        / <returns>是否成功</returns>        bool Remove(int

75、0;id);        / <summary>        / 取得指定留言的全部評論        / </summary>        / <param name="messag

76、eId">指定留言的ID</param>        / <returns>評論實體類集合</returns>        IList<CommentInfo> GetByMessage(int messageId);     由業(yè)務(wù)邏輯確定數(shù)據(jù)訪問操作IAdminBLL需要的數(shù)據(jù)訪問操作:

77、插入管理員,刪除管理員,更新管理員信息,按ID取得管理員信息,按登錄名與密碼取得管理員,取得全部管理員IMessageBLL需要的數(shù)據(jù)訪問操作:插入留言,刪除留言,更新留言信息,按ID取得留言信息,按分頁取得留言ICommentBLL需要的數(shù)據(jù)訪問操作:插入評論,刪除評論,按留言取得全部評論另外,添加管理員時需要驗證是否存在同名管理員,所以需要添加一個“按登錄名取得管理員”。對以上操作進行整理,的如下接口操作:IAdminDAL:Insert,Delete,Update,GetByID,GetByNameAndPassword,GetAllIMessageDAL:Insert,Delete,U

78、pdate,GetByID,GetByPageICommentDAL:Insert,Delete,GetByMessage這三個接口文件放在IDAL工程下,具體代碼如下:IAdminDAL.cs:using System;using System.Collections.Generic;using System.Text;using NGuestBook.Entity;namespace NGuestBook.IDAL    / <summary>   

79、 / 數(shù)據(jù)訪問層接口-管理員    / </summary>    public interface IAdminDAL            / <summary>        / 插入管理員  

80、60;     / </summary>        / <param name="admin">管理員實體類</param>        / <returns>是否成功</returns>      &#

81、160; bool Insert(AdminInfo admin);        / <summary>        / 刪除管理員        / </summary>        /&

82、#160;<param name="id">欲刪除的管理員的ID</param>        / <returns>是否成功</returns>        bool Delete(int id);        / <summar

83、y>        / 更新管理員信息        / </summary>        / <param name="admin">管理員實體類</param>       

84、0;/ <returns>是否成功</returns>        bool Update(AdminInfo admin);        / <summary>        / 按ID取得管理員信息     

85、0;  / </summary>        / <param name="id">管理員ID</param>        / <returns>管理員實體類</returns>        AdminInfo&#

86、160;GetByID(int id);        / <summary>        / 按管理員名取得管理員信息        / </summary>        / <param

87、60;name="name">管理員名</param>        / <returns>管理員實體類</returns>        AdminInfo GetByName(string name);        / <summary>&

88、#160;       / 按用戶名與密碼取得管理員信息        / </summary>        / <param name="name">用戶名</param>        /

89、 <param name="password">密碼</param>        / <returns>管理員實體類,不存在時返回null</returns>        AdminInfo GetByNameAndPassword(string name,string password); &#

90、160;      / <summary>        / 取得全部管理員信息        / </summary>        / <returns>管理員實體類集合</returns> 

91、60;      IList<AdminInfo> GetAll();    IMessageDAL.cs:using System;using System.Collections.Generic;using System.Text;using NGuestBook.Entity;namespace NGuestBook.IDAL    / <summary>&

92、#160;   / 數(shù)據(jù)訪問層接口-留言    / </summary>    public interface IMessageDAL            / <summary>        / 插入

93、留言        / </summary>        / <param name="message">留言實體類</param>        / <returns>是否成功</returns>   &#

94、160;    bool Insert(MessageInfo message);        / <summary>        / 刪除留言        / </summary>     

95、;   / <param name="id">欲刪除的留言的ID</param>        / <returns>是否成功</returns>        bool Delete(int id);       

96、60;/ <summary>        / 更新留言信息        / </summary>        / <param name="message">留言實體類</param>    &#

97、160;   / <returns>是否成功</returns>        bool Update(MessageInfo message);        / <summary>        / 按ID取得留言信息  

98、;      / </summary>        / <param name="id">留言ID</param>        / <returns>留言實體類</returns>      &#

99、160; MessageInfo GetByID(int id);        / <summary>        / 按分頁取得留言信息        / </summary>        

100、;/ <param name="pageSize">每頁顯示幾條留言</param>        / <param name="pageNumber">當前頁碼</param>        / <returns>留言實體類集合</returns>  &#

101、160;     IList<MessageInfo> GetByPage(int pageSize,int pageNumber);    ICommentDAL.cs:using System;using System.Collections.Generic;using System.Text;using NGuestBook.Entity;namespace NGuestBook.IDAL 

102、0;  / <summary>    / 數(shù)據(jù)訪問層接口-評論    / </summary>    public interface ICommentDAL            / <summary>   &#

103、160;    / 插入評論        / </summary>        / <param name="comment">評論實體類</param>        / <returns>是否成

104、功</returns>        bool Insert(CommentInfo comment);        / <summary>        / 刪除評論        / </sum

105、mary>        / <param name="id">欲刪除的評論的ID</param>        / <returns>是否成功</returns>        bool Delete(int id); &#

106、160;      / <summary>        / 取得指定留言的全部評論        / </summary>        / <param name="messageId">指

107、定留言的ID</param>        / <returns>評論實體類集合</returns>        IList<CommentInfo> GetByMessage(int messageId);    基于.NET平臺的分層架構(gòu)實戰(zhàn)(六)依賴注入機制與IoC的設(shè)計與實現(xiàn)我們設(shè)計的分層架構(gòu),層與層之間應(yīng)該是

108、松散耦合的。因為是單向單一調(diào)用,所以,這里的“松散耦合”實際是指上層類不能具體依賴于下層類,而應(yīng)該依賴于下層提供的一個接口。這樣,上層類不能直接實例化下層中的類,而只持有接口,至于接口所指變量最終究竟是哪一個類,則由依賴注入機制決定。之所以這樣做,是為了實現(xiàn)層與層之間的“可替換”式設(shè)計,例如,現(xiàn)在需要換一種方式實現(xiàn)數(shù)據(jù)訪問層,只要這個實現(xiàn)遵循了前面定義的數(shù)據(jù)訪問層接口,業(yè)務(wù)邏輯層和表示層不需要做任何改動,只需要改一下配置文件系統(tǒng)即可正常運行。另外,基于這種結(jié)構(gòu)的系統(tǒng),還可以實現(xiàn)并行開發(fā)。即不同開發(fā)人員可以專注于自己的層次,只有接口被定義好了,開發(fā)出來的東西就可以無縫連接。在J2EE平臺上,主要

109、使用Spring框架實現(xiàn)依賴注入。這里,我們將自己做一個依賴注入容器。依賴注入的理論基礎(chǔ)是Abstract Factory設(shè)計模式,這里結(jié)合具體實例簡單介紹一下。圖6.1、Abtract Factory應(yīng)用示例 上圖以數(shù)據(jù)訪問層為例,展示了Abstract Factory模式的應(yīng)用。如圖,現(xiàn)假設(shè)有針對Access和SQLServer兩種數(shù)據(jù)庫的數(shù)據(jù)訪問層,它們都實現(xiàn)了數(shù)據(jù)訪問層接口。每個數(shù)據(jù)訪問層有自己的工廠,所有工廠都實現(xiàn)自IDALFactory接口。而客戶類(這里就是業(yè)務(wù)邏輯層類)僅與工廠接口、數(shù)據(jù)訪問層接口耦合,而與具體類無關(guān),這樣,只要通過配置文件確定實例化哪個工廠,就可以得

110、到不同的數(shù)據(jù)訪問層。 然而,這種設(shè)計雖然可行,但是代碼比較冗余,因為這樣需要為數(shù)據(jù)訪問層的每一個實現(xiàn)編寫一個工廠,業(yè)務(wù)邏輯層也一樣。在以前,我們毫無辦法,但是,.NET平臺引入的反射機制,給我們提供了一種解決方案。使用反射,每個層只需要一個工廠,然后通過從配置文件中讀出程序集的名稱,動態(tài)加載相應(yīng)類。另外,為了提高依賴注入機制的效率,這里引入緩存機制。下面來看具體實現(xiàn)。配置首先,需要在Web工程的Web.config文件的<appSettings>節(jié)點下添加如下兩個項:<add key="DAL" value=""/><add key="BLL" value=""/>這兩個配置選項分別存儲要應(yīng)用的數(shù)據(jù)訪問和也業(yè)務(wù)邏輯層的程序集名稱。value目前是空,是因為目前還沒有各個層次的具體實現(xiàn)。實現(xiàn)緩存操作輔助類為實現(xiàn)緩存操作,我們將緩存操作封裝成一個輔助類,放在Utility工程下,具體代碼如下:CacheAccess.cs:using System;using System

溫馨提示

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

評論

0/150

提交評論