架構基本原則:
這裡,將描述一些在這個架構設計中的基本原則,其 中很多都是經典的設計原則,不過針對分層架構的特點,用我自己的語言進行了 描述。其中也有我自己提出的原則。
逐層調用原則及單向調用原則
現在約定將N層架構的各層依次編號為1、2、…、K、…、N -1、N,其中層的編號越大,則越處在上層。那麼,我們設計的架構應該滿足以下 兩個原則:
1.第K(1<K<=N)層只准依賴第K-1層,而不可依賴其他 底層。
2.如果P層依賴Q層,則P的編號一定大於Q。
其中第一個原 則,保證了依賴的逐層性,及整個架構的依賴是逐層向下的,而不能跨層依賴。 第二個原則,則保證了依賴的單向性,及只能上層依賴底層,而不能底層反過來 依賴上層。
針對接口編程,而不是針對實現編程
這裡所指的接口 ,不是特指編程語言中的具體語言元素(如C#中由Interface定義的語言接口), 而是指一種抽象的,在語義層面上起著接合作用語義體。它的具體實現,可能是 接口,可能是抽象類,甚至可能是具體類。
我認為,從不同的視角,接口 可以有以下兩種定義:
1.接口是一組規則的集合,它規定了實現本接口的 類或接口必須擁有的一組規則。體現了自然界“如果你是…… 則必須能……”的理念。
2.接口是在一定粒度視圖上 同類事物的抽象表示。注意這裡我強調了在一定粒度視圖上,因為“同類事 物”這個概念是相對的,它因為粒度視圖不同而不同。
具體到N層架 構中,針對接口編程的意義在部分上是這樣的:
現仍約定將N層架構的各 層依次編號為1、2、…、K、…、N-1、N,其中層的編號越大,則越 處在上層,那麼第K層不應該依賴具體一個K-1層,而應該依賴一個K-1層的接口, 即在第K層中不應該有K-1層中的某個具體類。
依賴倒置原則
在軟件設計原則中,有一種重要的思想叫做依賴倒置。它的核心思想是:不能讓高層 組件依賴底層組件,而且,不管高層組件和底層組件,兩者都應依賴於抽象。
那麼,這個原則和我們上面的原則是否矛盾呢?其實並不矛盾。
因為這個原則定義中的“依賴”是指“具體依賴”,而上 面定義中的依賴全部指“抽象依賴”。我對這兩種依賴的定義如下:
具體依賴——如果P層中有一個或一個以上的地方實例化了Q層 中某個具體類,則說P層具體依賴於Q層。
抽象依賴——如果P 層沒有實例化Q層中的具體類,而是在一個或一個以上的地方實例化了Q層中某個 接口,則說P層抽象依賴於Q層,也叫接口依賴於Q層。
從這兩個定義可以 看到,所謂的依賴倒置原則,正是上面提到針對接口編程,而不是針對實現編程 ,兩者在本質上是統一的。
綜上所述,可以看出,本課題設計的分層架構 ,應該是這樣一種架構:
1.N層架構的各層依次編號為1、2、…、K 、…、N-1、N,其中層的編號越大,則越處在上層。
2.架構中僅存 在一種依賴,即第K層接口依賴第K-1層,其中1<K<=N。
封裝變化原 則
封裝變化的原則定義為:找出應用中可能需要變化之處,把它們獨立出 來,不要和那些不需要變化的代碼混雜在一起。
開放-關閉原則
開 發-關閉原則定義為:對擴展開放,對修改關閉。
具體到N層架構中,可以 描述為:當某一層有了一個新的具體實現時,它應該可以在不修改其他層的情況 下,與此新實現無縫連接,順利交互。
單一歸屬原則
在這個架構 中,任何一個操作類都應該有單一的職責,屬於單獨的一層,而不能同時擔負兩 種職責或屬於多個層次(實體類及輔助類可以被多個層使用,但它們不屬於任何 一個層,而是獨立存在)。
層次劃分:
目前,典型的分層架構是 三層架構,即自底向上依次是數據訪問層、業務邏輯層和表示層。
這種經 典架構經歷了時間的考驗和實踐的多次檢驗,被認為是合理、有效的分層設計, 所以,在本文中,將沿襲這種經典架構,使用數據訪問層、業務邏輯層和表示層 的三層架構體系。
職責劃分:
目前,在典型的三層架構中,對層 次各自的職責劃分並沒有一個統一的規范,綜合現有的成功實踐和.NET平台的特 殊性,在本文中將三層架構的職責劃分如下:
數據訪問層—— 負責與數據源的交互,即數據的插入、刪除、修改以及從數據庫中讀出數據等操 作。對數據的正確性和有效性不負責,對數據的用途不了解,不負擔任何業務邏 輯。
業務邏輯層——負責系統領域業務的處理,負責邏輯性數 據的生成、處理及轉換。對流入的邏輯性數據的正確性及有效性負責,對流出的 邏輯性數據及用戶性數據不負責,對數據的呈現樣式不負責。
表示層 ——負責接收用戶的輸入、將輸出呈現給用戶以及訪問安全性驗證。 對流入的數據的正確性和有效性負責,對呈現樣式負責,對流出的數據正確性不 負責,但負責在數據不正確時給出相應的異常信息。
模塊劃分及交互設計 :
綜合以上分析,可在宏觀上將整個系統分為一下幾個模塊:
實 體類模塊——一組實體類的集合,負責整個系統中數據的封裝及傳遞 。
數據訪問層接口族——一組接口的集合,表示數據訪問層的 接口。
業務邏輯層接口族——一組接口的集合,表示業務邏輯 層的接口。
數據訪問層模塊——一組類的集合,完成數據訪問 層的具體功能,實現數據訪問層接口族。
業務邏輯層模塊—— 一組類的集合,完成業務邏輯層的具體功能,實現業務邏輯層接口族。
表 示層模塊——程序及可視元素的集合,負責完成表示層的具體功能。
IoC容器模塊——負責依賴注入的實現。
輔助類模塊 ——完成全局輔助性功能。
各模塊見交互關系如下:
這篇中理論比較多,但是它是整個架構的基礎,可以幫助朋友們對將要 實現的項目架構及要遵循的原則有一個整體的了解。當然,在後續文章中,將主 要討論Demo項目的實際開發過程,那時,這些思想和理論性的東西將得到體現。