最近找數據,看到了博客園在不久以前,辦了一個架構分享的活動:.Net項目分層與文件夾結構大全。看完以後以爲獲益良多,接着也忍不住手癢,開始整理屬於本身的分層架構:「CLK Architecture」。php
CLK Architecture的設計,是以DDD(Domain-driven design)概念精神作爲核心,而且選用微軟.NET相關技術來實做。指望提供開發人員,在開發.NET相關應用程序時,有個基礎的分層架構、命名慣例能夠參考,省去每一個項目都要從新思考設計的腦力消耗。另外CLK Architecture也作爲開發技術的索引地圖,在每一個不一樣的分層中,推薦可選用的各類技術框架,用以下降整個系統開發的評估成本。html
在CLK Architecture中,有幾個要點須要先作說明:git
Domain Layer封裝提供企業邏輯的領域對象、以及領域對象進出系統的邊界接口。github
在DDD(Domain-driven design)的概念精神裏,系統中的企業邏輯能夠被捕捉而且描繪出領域模型,再由領域模型去分析設計出對應的領域對象,用以在計算機系統中提供解決方案。而計算機系統中所執行的的領域對象,免不了須要將數據存放到數據庫、或是從系統外部取得數據,這些與數據庫、系統外部交換數據的功能,會被分析設計爲對應的邊界對象,而後再套用IoC模式來產生邊界接口,用以切割領域對象與邊界對象的相依。在CLK Architecture中這些領域對象(Entity、ValueO bject...)、邊界界面(IRepository、IFactory...),會被分門別類、封裝成爲Domain Layer的內容。spring
對於領域模型、領域對象的捕捉與設計,有興趣的開發人員能夠參考下列數據:數據庫
Data Access Layer封裝領域對象進出系統的邊界對象。apache
在DDD(Domain-driven design)的概念精神裏,系統中的領域對象與數據庫、系統外部交換數據的功能,會被分析設計爲對應的邊界對象,而後再套用IoC模式來產生邊界接口,用以切割領域對象與邊界對象的相依。在CLK Architecture中這些邊界對象(Repository、Factory...),會被分門別類、封裝成爲Data Access Layer的內容。json
Persistence用來封裝系統與數據庫交換數據的邊界對象,這些邊界對象實做透過IoC模式所產生的邊界接口,用以提供領域對象進出數據庫的功能。windows
在CLK Architecture中是採用領域對象來作爲進出數據庫的數據單位,而企業中比較常見的數據庫是關係數據庫,在領域對象與關係數據庫之間存在着「阻抗不匹配」的問題,領域對象是沒有辦法直接進出關係數據庫的。 開發人員能夠選用下列O/R Mapping框架、或是人工創建O/R Mapping相關程序代碼,來實做系統中領域對象進出數據庫的功能。架構
Persistence用來封裝系統與Config文件交換數據的邊界對象,這些邊界對象實做透過IoC模式所產生的邊界接口,用以提供存取Config文件的功能。
在系統中除了將數據存放到數據庫以外,也經常會須要透過Config檔的方式來存放一些設定數據,讓佈署程序的過程可以更加的便利。 開發人員能夠選用下列框架、或是人工創建相關程序代碼,來實做系統中存取Config文件的功能。
ProxyModel用來封裝系統與子系統交換數據的邊界對象,這些邊界對象實做透過IoC模式所產生的邊界接口,用以提供存取子系統的功能。
在系統中除了將數據存放到數據庫、Config文件以外,某些情景也會透過TCP、WCF、Web API、函式庫引用...等等接口來與子系統交換數據,藉以重用子系統的功能。 開發人員能夠套用Adapter、Proxy...等等模式來包裝子系統,來實做系統中存取子系統的功能。
Interface Layer封裝與用戶互動的用戶接口對象、以及與遠程系統互動的通信接口合約。
在DDD(Domain-driven design)的概念精神裏,與用戶互動的用戶接口,會被分析設計爲對應的用戶接口對象。而在用戶以外,系統也須要透過通信接口來提供功能給遠程系統使用,這些與遠程系統交換數據的通信接口,會被分析設計爲提供通信功能的通信接口對象、以及提供通信描述的通信接口合約。在CLK Architecture中這些用戶接口對象、通信接口合約,會被分門別類,封裝成爲Interface Layer的內容。
View用來封裝系統與與用戶互動的用戶接口對象,這些用戶接口對象會透過網站頁面、應用程序窗體...等等方式,來接受用戶的輸入、而且數據呈現給用戶。
關於用戶接口的開發與設計,應該依照項目需求、人力配置來作選擇,開發人員能夠參考下列數據來學習:
ServiceModel用來封裝系統與遠程系統交換數據的通信接口合約,這些通信接口合約依照選擇的技術框架,會以不一樣形式存在於系統之中。而通信接口合約若是是以程序代碼的方式存在於系統之中,這些通信接口合約中所使用的各類數據傳輸對象(Data transfer object),也必須以程序代碼的方式存在於系統,而且一樣封裝成爲ServiceModel的內容。
下列說明幾種以不一樣形式存在的通信接口合約:
關於通信接口合約、數據傳輸對象的開發與設計,應該依照項目需求、人力配置來作選擇,開發人員能夠參考下列數據來學習:
Application Layer封裝與用戶互動的用戶領域對象、以及與遠程系統互動的通信接口對象。
在DDD(Domain-driven design)的概念精神裏,系統中除了包含企業邏輯以外、也包含了提供用戶接口使用的功能邏輯(例如:驗證、受權、數據組合...等等),這些功能邏輯會被分析設計爲對應的用戶領域對象。而在用戶接口以外提供給遠程系統使用的通信接口,也會被分析設計爲提供通信功能的通信接口對象、以及提供通信描述的通信接口合約。在CLK Architecture中這些用戶領域對象、通信接口對象,會被分門別類,封裝成爲Application Layer的內容。
ViewModel用來封裝提供用戶接口功能邏輯的用戶領域對象,這些用戶領域對象實做用戶接口對象所須要的功能邏輯,用以提供功能給用戶接口對象使用。
在系統中的用戶接口會提供驗證身份、受權功能...等等功能給用戶,這些功能不屬於企業邏輯因此不會被封裝成爲領域對象,會被分析設計爲用戶領域對象。而在用戶接口中經常須要的數據對象不是單一領域對象,須要由多個領域對象組合成的數據對象,這些數據對象、數據對象組合與分解也被劃分在用戶領域對象之中。
這邊要特別說明的是,若是目標系統的企業邏輯是處理驗證身份、受權功能的功能,那在目標系統中封裝這些功能的對象,會被劃分在領域對象之中。也就是說,一個封裝功能的對象是屬於領域對象、用戶領域對象,應該依照是否爲目標系統的企業邏輯來區分。
ApplicationModel用來封裝系統與遠程系統交換數據的通信接口對象,這些通信接口對象實做系統所包含的通信接口合約,用以提供功能給遠程系統使用。
在系統中的通信接口會提供功能給遠程系統使用,這些功能不屬於企業邏輯因此不會被封裝成爲領域對象,會被分析設計爲通信接口對象。而在通信接口中用來封裝通信數據的數據傳輸對象(Data transfer object),會是由一個到多個領域對象來組合、或是分解爲一個到多個領域對象,這些數據傳輸對象的組合與分解也被劃分在用戶領域對象之中。
Host Layer封裝系統中生成與組合各個Layer的功能,而且以應用程序、網站、系統服務...等等方式來設計爲宿主程序,用以執行以後在計算機系統中提供解決方案。
關於宿主程序的開發與設計,應該依照項目需求、人力配置來作選擇,開發人員能夠參考下列數據來學習。(括號內容爲CLK Architecture的命名慣例)
Infrastructure Layer封裝系統中共享的功能模塊。
提供Dependency Injection的功能模塊。開發人員能夠選用下列框架、或是人工創建相關程序代碼,來實做系統中Dependency Injection的功能。
提供O/R Mapping的功能模塊。開發人員能夠選用下列框架、或是人工創建相關程序代碼,來實做系統中O/R Mapping的功能。
提供Logging的功能模塊。開發人員能夠選用下列框架、或是人工創建相關程序代碼,來實做系統中Logging的功能。
Other Layer封裝不屬於在系統架構的設計範圍,但倒是系統開發設計時,一定會創建的功能模塊。
提供系統測試的功能模塊。系統測試在近代軟件開發中扮演的角色愈來愈重要,有興趣的開發人員能夠找尋相關數據來學習。
提供系統展現的功能模塊。在系統開發的各個階段都會須要產生一些展現項目,用來驗證功能模塊是否符合需求。