領域模型驅動開發(2)-工程結構的調整
#一. 背景#
目前很多的業務程式碼存在以下問題
-
bean的建立太隨意,基本就是一個需求一些對應的dto,vo,query bean。
-
不同開發者對於同一個領域的東西有不同的bean,同一個開發者對於相同邏輯的bean,在經過2月+的時間,自己又定義出了一個差不多的bean -> 職責分散
-
不同開發者對於某塊相同業務的邏輯校驗放在了不同的service中 ->程式碼邏輯重複
-
不同的後端/前端對接時,相同概念的命名存在差異,導致後面重構時資料訪問沉澱到manager層,上層呼叫的時候處理case有問題
-
DTO型別的bean重構過程中根本不知道哪些是可以為Null,哪些不可以
根本沒有上下文/邊界的概念,比如說模組A會和模組B有互動,模組C會和模組B有互動,通常在DB儲存時只會存關聯id,然後需要去取對應的名稱,其他屬性資訊。
這些資訊的獲取,有些開發在manager層操作,然後將屬性定義到了模組A相關的DTO中,有些放在了service層做,對於模組B的有效性校驗,也是在不同的service中
#二. 工程架構圖演進#
現狀##
目前的系統結構圖通常下面這樣
-
四層 controller/service/manager/mapper
-
不可以同級呼叫
-
上級可以知曉下級,下級不可知曉上級,也就是bean的轉化放在上級
這個分層結構和領域模型對應一下就會發現有些問題
-
資源服務層repository是面向DB程式設計
-
service層是面向前端頁面程式設計。
這樣對於某一塊的業務,還是沒有將邏輯抽象到一起,也就不可避免的邏輯冗餘
##改進##
-
service層只能呼叫自己領域的manager
-
增加一層Facade層,專門處理與其他領域的互動(如果業務還沒有這麼複雜,加上層級太多影響開發效率,
可以採用FacadeXXXService來標識這個類專門處理與其他領域的互動)
這樣調整以後結構清晰了許多了,manager層只處理自己領域的資料/快取,service層處理自己領域的業務。與外界互動都在自己Facade層。
雖然這些改造都只是包結構的調整,但對於一個持續迭代的多人專案開發,帶來的好處是能夠快速瞭解某一塊業務,當新人寫這塊業務的時候,能夠寫在對應的模組,能夠利用已經寫好的邏輯/bean.
#三. 領域識別#
領域演進
. 明確的領域
這些領域概念比較清晰,在業界比較通用在一開始就能明確,比如使用者,商品,訂單
演變的領域
有些業務是不斷演進的,一個領域也會裂表為多個領域,比如訂單和支付。
也有一些比較模糊的領域區分,比如商品清單這邊有個清單業務,將商品新增到清單,就是一個collection,DB的設計也就是關聯id而已,它能夠劃分到商品領域嗎,不能,因為它不屬於商品,沒有它不影響商品業務。
清單只是一個展示商品的地方。那他能成為一個單獨的領域,也很勉強,因為它的概念比較單薄,可以抽象出來的東西比較少,對於這類的問題,建議是在類級別做區分,當它的概念不斷增加,領域不斷豐富時,抽出到單獨的包,作為一個新的領域
#四. 領域模型與微服務化#
做上面結構的調整,除了能夠提供程式碼規範性,另外一個好處就是做減小微服務化的改造代價。因為邊界清晰,與其他業務的互動清晰。比如你有一個工程,規劃了6個領域模組,當某個領域模組發展足夠大,可以遷移出去作為一個獨立的微服務部署,這時候只需要將它對應的service,manager包,以及對於的bean遷出即可。其他服務與它的互動可以由service改成soa呼叫
潛在的問題
目前的領域物件還是不夠豐富
當領域物件多了,相同的編排/組合領域物件也可以成為一個獨立的領域上下文,這時候如何定義這類領域
相關文章
- 領域模型驅動開發(1)模型
- 領域驅動設計中的模型模型
- 前端開發-領域驅動設計前端
- 行為驅動開發(BDD)如何與領域驅動設計(DDD)結合?
- 讀書系列-《解構領域驅動》-領域概念
- 領域驅動設計與敏捷開發敏捷
- 領域驅動設計與模型驅動設計的關係模型
- 領域模型驅動設計(DDD)之模型提煉模型
- 領域驅動模型DDD(二)——領域事件的訂閱/釋出實踐模型事件
- Java開發架構篇《初識領域驅動設計DDD落地》Java架構
- Java開發架構篇:初識領域驅動設計DDD落地Java架構
- 領域驅動模型DDD(一)——服務拆分策略模型
- 聊一聊領域驅動與貧血模型模型
- Apache Isis 1.0 釋出,領域驅動開發框架Apache框架
- 領域驅動設計整合與架構架構
- Windows的驅動開發模型Windows模型
- DDD領域驅動設計:領域事件事件
- 微服務與領域驅動設計,架構實踐總結微服務架構
- 領域驅動設計(DDD)中模型的重要性 - Jeronimo模型
- 領域故事講述:協作構建領域驅動軟體 - Stefan Hofer
- Java開發架構篇:領域驅動設計架構基於SpringCloud搭建微服務Java架構SpringGCCloud微服務
- 結合領域事件和微服務的實現領域驅動設計 - Alagarsamy事件微服務
- 領域驅動模型DDD(三)——使用Saga管理事務模型
- .NET應用架構設計—面向查詢的領域驅動設計實踐(調整傳統三層架構,外加維護型的業務開關)應用架構
- 基於上下文圖的策略性領域驅動開發
- 領域驅動設計戰術模式--領域事件模式事件
- 戲說領域驅動設計(廿五)——領域事件事件
- 驅動開發之基本資料結構資料結構
- 軟體工程團隊的基於領域的結構 - snaptravel軟體工程APT
- [.NET領域驅動設計實戰系列]專題二:結合領域驅動設計的面向服務架構來搭建網上書店...架構
- 《實現領域驅動設計》筆記——架構筆記架構
- 戲說領域驅動設計(十三)——核心架構架構
- 戲說領域驅動設計(九)——架構模式架構模式
- 理解領域驅動設計
- MasaFramework -- 領域驅動設計Framework
- 領域驅動設計示例
- JavaScript中的領域驅動設計JavaScript
- 戲說領域驅動設計(廿七)——Saga設計模型模型