摘要:[DDD] CLK Architecture
CLK.Architecture
最近找資料,看到了博客園在不久之前,辦了一個架構分享的活動:.Net项目分层与文件夹结构大全。看完之後覺得獲益良多,接著也忍不住手癢,開始整理屬於自己的分層架構:「CLK Architecture」。
CLK Architecture的設計,是以DDD(Domain-driven design)概念精神做為核心,並且選用微軟.NET相關技術來實作。期望提供開發人員,在開發.NET相關應用程式時,有個基礎的分層架構、命名慣例可以參考,省去每個專案都要重新思考設計的腦力消耗。另外CLK Architecture也做為開發技術的索引地圖,在每個不同的分層中,推薦可選用的各種技術框架,用以降低整個系統開發的評估成本。
Architecture Diagram
在CLK Architecture中,有幾個要點需要先做說明:
- CLK Architecture是一個Layer層級的架構設計,系統會由零到多個Layer來組合成為一個完整的Tier。
- CLK Architecture裡的每個Layer,是概念上的功能分層,實作時會包含零到多個功能模組。
- CLK Architecture裡Layer包含的每個區塊,是概念上的功能模組,實作時會包含零到多個程式專案。
Domain Layer
Domain Layer封裝提供企業邏輯的領域物件、以及領域物件進出系統的邊界介面。
在DDD(Domain-driven design)的概念精神裡,系統中的企業邏輯可以被捕捉並且描繪出領域模型,再由領域模型去分析設計出對應的領域物件,用以在電腦系統中提供解決方案。而電腦系統中所執行的的領域物件,免不了需要將資料存放到資料庫、或是從系統外部取得資料,這些與資料庫、系統外部交換資料的功能,會被分析設計為對應的邊界物件,然後再套用IoC模式來產生邊界介面,用以切割領域物件與邊界物件的相依。在CLK Architecture中這些領域物件(Entity、ValueO bject...)、邊界介面(IRepository、IFactory...),會被分門別類、封裝成為Domain Layer的內容。
DomainModels
對於領域模型、領域物件的捕捉與設計,有興趣的開發人員可以參考下列資料:
Access Layer
Access Layer封裝領域物件進出系統的邊界物件。
在DDD(Domain-driven design)的概念精神裡,系統中的領域物件與資料庫、系統外部交換資料的功能,會被分析設計為對應的邊界物件,然後再套用IoC模式來產生邊界介面,用以切割領域物件與邊界物件的相依。在CLK Architecture中這些邊界物件(Repository、Factory...),會被分門別類、封裝成為Access Layer的內容。
DataAccesses
DataAccesses用來封裝系統與資料庫交換資料的邊界物件,這些邊界物件實作透過IoC模式所產生的邊界介面,用以提供領域物件進出資料庫的功能。
在CLK Architecture中是採用領域物件來做為進出資料庫的資料單位,而企業中比較常見的資料庫是關聯式資料庫,在領域物件與關聯式資料庫之間存在著「阻抗不匹配」的問題,領域物件是沒有辦法直接進出關聯式資料庫的。 開發人員可以選用下列O/R Mapping框架、或是人工建立O/R Mapping相關程式碼,來實作系統中領域物件進出資料庫的功能。
ServiceAccesses
ServiceAccesses用來封裝系統與子系統交換資料的邊界物件,這些邊界物件實作透過IoC模式所產生的邊界介面,用以提供存取子系統的功能。
在系統中除了將資料存放到資料庫之外,某些情景也會透過TCP、WCF、Web API、函式庫引用...等等介面來與子系統交換資料,藉以重用子系統的功能。 開發人員可以套用Adapter、Proxy...等等模式來包裝子系統,來實作系統中存取子系統的功能。
Interface Layer
Interface Layer封裝與使用者互動的用戶介面物件、以及與遠端系統互動的通訊介面合約。
在DDD(Domain-driven design)的概念精神裡,與使用者互動的用戶介面,會被分析設計為對應的用戶介面物件。而在使用者之外,系統也需要透過通訊介面來提供功能給遠端系統使用,這些與遠端系統交換資料的通訊介面,會被分析設計為提供通訊功能的通訊介面物件、以及提供通訊描述的通訊介面合約。在CLK Architecture中這些用戶介面物件、通訊介面合約,會被分門別類,封裝成為Interface Layer的內容。
Views
Views用來封裝系統與與使用者互動的用戶介面物件,這些用戶介面物件會透過網站頁面、應用程式表單...等等方式,來接受使用者的輸入、並且資料呈現給使用者。
關於用戶介面的開發與設計,應該依照專案需求、人力配置來做選擇,開發人員可以參考下列資料來學習:
Services
Services用來封裝系統與遠端系統交換資料的通訊介面合約,這些通訊介面合約依照選擇的技術框架,會以不同形式存在於系統之中。而通訊介面合約如果是以程式碼的方式存在於系統之中,這些通訊介面合約中所使用的各種資料傳輸物件(Data transfer object),也必須以程式碼的方式存在於系統,並且同樣封裝成為Services的內容。
下列說明幾種以不同形式存在的通訊介面合約:
- WCF的通訊介面合約,是以程式碼的方式存在於系統。(WCF Contract)
- Web Service的通訊介面合約,是以XML的方式存在於系統。(WSDL)
- 自訂通訊(TCP、UDP)的通訊介面合約,會以說明書的方式存在於系統之中、程式碼之外。(Word)
關於通訊介面合約、資料傳輸物件的開發與設計,應該依照專案需求、人力配置來做選擇,開發人員可以參考下列資料來學習:
Application Layer
Application Layer封裝與使用者互動的用戶領域物件、以及與遠端系統互動的通訊介面物件。
在DDD(Domain-driven design)的概念精神裡,系統中除了包含企業邏輯之外、也包含了提供用戶介面使用的功能邏輯(例如:驗證、授權、資料組合...等等),這些功能邏輯會被分析設計為對應的用戶領域物件。而在用戶介面之外提供給遠端系統使用的通訊介面,也會被分析設計為提供通訊功能的通訊介面物件、以及提供通訊描述的通訊介面合約。在CLK Architecture中這些用戶領域物件、通訊介面物件,會被分門別類,封裝成為Application Layer的內容。
ViewModels
ViewModels用來封裝提供用戶介面功能邏輯的用戶領域物件,這些用戶領域物件實作用戶介面物件所需要的功能邏輯,用以提供功能給用戶介面物件使用。
在系統中的用戶介面會提供驗證身份、授權功能、狀態保存...等等功能,這些功能不屬於企業邏輯所以不會被封裝成為領域物件,而是會被分析設計為用戶領域物件。另外在用戶介面中常常需要的資料物件不是單一領域物件,需要由多個領域物件組合成的資料物件,這些資料物件的組合與分解也被劃分在ViewModels之中。
這邊要特別說明的是,如果目標系統的企業邏輯是處理驗證身份、授權功能的功能,那在目標系統中封裝這些功能的物件,會被劃分在領域物件之中。也就是說,一個封裝功能的物件是屬於領域物件、用戶領域物件,應該依照是否為目標系統的企業邏輯來區分。
ServiceModels
ServiceModels用來封裝系統與遠端系統交換資料的通訊介面物件,這些通訊介面物件實作系統所包含的通訊介面合約,用以提供功能給遠端系統使用。
在系統中的通訊介面會提供功能給遠端系統使用,這些功能不屬於企業邏輯所以不會被封裝成為領域物件,而是會被分析設計為通訊介面物件。至於在通訊介面中用來封裝通訊資料的資料傳輸物件(Data transfer object),會是由一個到多個領域物件來組合、或是分解為一個到多個領域物件,這些資料傳輸物件的組合與分解也被劃分在ServiceModels之中。
Host Layer
Host Layer封裝系統中生成與組合各個Layer的功能,並且以應用程式、網站、系統服務...等等方式來設計為宿主程式,用以執行之後在電腦系統中提供解決方案。
關於宿主程式的開發與設計,應該依照專案需求、人力配置來做選擇,開發人員可以參考下列資料來學習。(括號內容為CLK Architecture的命名慣例)
- WPF (WinApp)
- ASP.NET (WebSite)
- ASP.NET MVC (WebSite)
- Windows Service (WinService)
- Windows Console (WinConsole)
- Windows Phone App (WinPhoneApp)
- Windows Store App (WinStoreApp)
Infrastructure Layer
Infrastructure Layer封裝系統中共用的功能模組。
Dependency Injection
提供Dependency Injection的功能模組。開發人員可以選用下列框架、或是人工建立相關程式碼,來實作系統中Dependency Injection的功能。
O/R Mapping
提供O/R Mapping的功能模組。開發人員可以選用下列框架、或是人工建立相關程式碼,來實作系統中O/R Mapping的功能。
Logging
提供Logging的功能模組。開發人員可以選用下列框架、或是人工建立相關程式碼,來實作系統中Logging的功能。
Other Layer
Other Layer封裝不屬於在系統架構的設計範圍,但卻是系統開發設計時,必定會建立的功能模組。
Tests
提供系統測試的功能模組。系統測試在近代軟體開發中扮演的角色越來越重要,有興趣的開發人員可以找尋相關資料來學習。
Sample
提供系統展示的功能模組。在系統開發的各個階段都會需要產生一些展示專案,用來驗證功能模組是否符合需求。
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。