去年4月,我們為 Rafy 框架添加了領域模型設計器組件。時隔一年,謹以本文,簡要說明該領域模型設計器的設計思想。
設計目標
Rafy 實體框架中以領域驅動設計作為指導思想。所以在開發時,以領域建模為首要任務。為此,我們為它開發了領域模型設計器。開發人員可以在設計器中,設計相應的領域模型,查看現有代碼對應的領域模型。
我們為這個設計器制定了以下功能:
- 外部簡單設計器:也就是設計器可以部署為一個可以獨立運行的軟件。該軟件可以打開領域模型的設計圖,方便團隊中的非開發人員角色查看。同樣,這個軟件最好也能支持對模型進行設計。
- Rafy 運行時設計器:Rafy 是一個插件化架構的框架。所以我們也期望這個設計器可以以插件的形式,直接運行在 Rafy 框架構建的應用程序中。這樣,在應用程序運行時,就能看到當前軟件對應的領域模型。
- VS 內部設計器:這是最重要的一個功能,我們希望設計器能與 Visual Studio 深度整合。首先,這樣使得可以在 Visual Studio 中就能直接進行領域建模,並能根據模型來生成實體代碼;其次,在使用 CodeFirst 的場景下,也能在 Visual Studio 中直接根據當前的實體類代碼來生成相應的領域模型設計圖。
設計方案
根據當前 Rafy 框架的架構,結合要實現的設計器的功能。規划整個設計器的所需要的組件:
並畫出組件間的依賴圖:
簡要說明各組件的用途:
- DDD Object Model:位於最底層的 DDD 對象模型,用於描述領域建模中的實體及實體間的關系。這里的對象模型結構,決定了上層可支持的 DDD 建模類型。
- Model Xml Document:用於支持對象模型的 XML 序列化。以 XML 文檔的形式定義了模型的顯示、實體類型、實體間的關系結構。
- WPF Controls:WPF 中可用於顯示模型的控件集。例如:實體塊、連接線等。
- WPF Model Viewer:基於 XML 文檔模型,操作 WPF 控件集,實現模型的顯示。
- WPF Model Designer:同樣基於 XML 文檔模型,操作 WPF 控件集,實現模型的編輯。(由於編輯相對顯示來說更復雜,所以設計器和查看器分為兩個單獨的包來實現。第一期只實現了查看器。)
- VS Package:Visual Studio 插件包。實現模型設計器集成到 VS 中;調用同步組件,實現代碼與模型間的同步。
- Code Synchronizer:代碼同步組件,實現代碼與模型間的同步(Model-First 或者 Code-First)。
- Rafy Entity Meta:當下 Rafy 框架中的實體運行時元數據包。
- Rafy Plugin:一個可運行在 Rafy 應用程序中的插件。這個插件用於查看運行時實體的領域模型關系圖。
- Standalone Designer(exe):獨立運行的設計器應用程序。
重點組件
下面,是重點組件的關系圖。
實現細節
設計完成后,規划整個實現的順序:
共花了半個月的時間來完成,以下是完成后的項目結構,其中選中的5個項目即是設計器相關的項目:
- Rafy.EntityObjectModel: 對應設計中的 DDD Object Model。
- DesingerEngine: 對應 WPF Controls。該項目被設計為一個可重用的,與 DDD 無關,用於圖形設計的程序集。
- Rafy.DomainModeling: 包含了設計時的 RafyDomainDocument、ModelViewer、XML Document 等組件。
- ModelingEnv: 一個簡單的獨立運行的 WPF 程序。
- VSPackage: VS 插件。
初步成果
20130328 開始實現,至20130415 完成第一版本,可在 VS 中查看實體的領域模型關系圖。
下面是模型查看器的效果:
以及使用獨立應用程序查看的效果:
PS: 由於一直都使用 CodeFirst 開發模式,所以過了一年了,到現在也只是實現了模型查看,還沒有實現模型設計的功能 。
最近半年沒怎么長進,所以沒東西可寫,今天把這個翻出來,給大家做個分享。