DDD核心概念

2021-10-06 23:38:43 字數 2269 閱讀 2895

領域

指範圍,邊界,特定的區域。

子域

把領域按照一定的業務規則劃分,進而劃分出多個子域,每個子域對應乙個更小的業務範圍。

它是把問題逐步分解,降低業務理解和系統實現的複雜度的過程。

它分為三類:核心域、通用域、支撐域。

通用語言

定義上下文的含義。在事件風暴中,通過團隊交流達成共識的,能簡單清晰準確地描述業務含義和規則的言語。

注意:在說某通用語言時,必須要限定在某個上下文內,以確保每個上下文含義在它特定的邊界內都有唯一的含義。

限界上下文

定義領域的邊界。

領域可以被拆分成多個子領域,乙個領域相當於乙個問題域,拆分的過程就是大問題拆分為小問題的過程,每個領域模型都有他對應的限界上下文,理論上限界上下文就是微服務的邊界。

實體

領域模型中的實體是有多個屬性,操作和行為的載體,擁有唯一標誌。實體和值物件是組成領域模型的基礎單元,ddd採用充血模型構建實體,使用id即可判定兩實體是否相等。

值物件

通過物件屬性值來識別的領域物件,將多個相關的屬性組合為乙個概念整體,具有整體概念和不可修改的屬性。值物件這宰使用屬性值進行判斷相等性。

實體和值物件是領域模型的最基本單元,一起實現實體最基本的核心領域,值物件依附於實體。

聚合/聚合根

聚合包含乙個聚合根和上下文邊界,這個邊界根據業務單一職責和高內聚原則,定義了聚合內部應該包含哪些實體和值物件,而聚合之間的邊界是松耦合的。

領域模型中的實體和值物件,好比個體,而能讓實體和值物件協同工作的組織,就是聚合,用於保證這些領域物件在實現共同的業務邏輯時,能保證資料的一致性。

業務的邏輯緊密關聯的實體和值物件組合而成,聚合是資料修改和持久化的基本單元,每個聚合對應乙個倉儲,實現資料的持久化。

那如何設計聚合?

1、採用事件風暴,根據業務行為,梳理出業務發生過程的實體和值物件

2、從眾多實體中選出,作為物件管理者的根實體,也叫聚合根

3、根據業務單一職責和高內聚原則,找出與聚合根關聯的所有的緊密依賴的實體和值物件

4、在聚合內根據聚合根,實體,值物件的依賴關係,畫出物件的引用和依賴模型

5、多個聚合根據業務語義和上下文一起劃分到同乙個限界上下文中

聚合的設計原則

1、在一致性邊界內建模真正的不變條件:聚合內的實體和值物件按照統一的業務規則執行,實現資料物件的一致性;

2、設計小聚合:降低由於業務過大導致的聚合重構的可能性;

3、通過唯一標誌引用其它聚合:聚合之間通過關聯外部聚合根id的方式引用;

5、通過應用層實現聚合的服務呼叫

領域事件

乙個領域事件將導致進一步的業務操作,在實現業務角耦的同時,有助於形成完整的業務閉環。

如何識別領域事件?

在事件風暴中,做場景分析時,出現類似「如果。。。。那麼。。。」,「發生。。時,則。。。」等,發生某一件事情時,觸發進一步的操作,那麼這個事件很有可能是領域事件。領域事件可以切斷領域模型之間的強依賴關係,事件發布完成之後,發布方不必關心訂閱方事件處理是否成功,實現領域模型之間的解耦,最終保證了事件的一致性。

根據使用場景來劃分,領域事件分為

1、微服務內的領域事件:完成業務實體構建和命令,事件資料的持久化後,按照ddd原則「一次事件只更新乙個聚合」,則需要把事件發布到事件匯流排,但是這樣會增加複雜度,因此需要結合應用複雜度和收益進行總和考慮。資料實時要求高的場景下,可以在應用服務層,通過跨聚合的服務編排和組合,以服務呼叫的方式完成跨聚合的訪問。這個過程會用到分布式事務,以保證發布方和訂閱方的資料同時更新。

2、微服務間的領域事件:可以採用微服務直接呼叫的方式,實現資料和服務的實時訪問,需要引入分布式事務以保證資料的一致性。考慮:事件構建,發布和訂閱,事件資料的持久化。

事件風暴

梳理使用者旅程,分析業務場景,領域專家和開發人員,頭腦風暴的過程,進而確定限界上下文,通用語言,找出實體,值物件等,依次進行領域分解,建立領域模型。

通過不同顏色,標出

【命令】藍色

【實體】綠色

【領域事件】橙色

【補充資訊】黃色

聚合/聚合根/實體/值物件 特徵

DDD 概念中的DDD

領域驅動設計,它是對物件導向的的分析和設計 object orient analysis design 的乙個補充,對技術框架進行了分層規劃,同時對每個類進行了策略和型別劃分。領域模型是領域驅動的核心 採用 的設計思想,業務邏輯不再集中在幾個大型的類上,而是在大量相對小的領域物件上,這些類具有自己的...

DDD中相關概念

倉儲定義 在領域層和資料對映層的中介,使用類似集合的介面來訪問領域物件 martin fowler 實際上,倉儲被用於領域物件在資料庫上的操作 實體entity和值物件value types 一般來說,我們針對不同的實體 或聚合根aggregate root 會建立相對應的倉儲。方法簽名是指方法的返...

領域驅動設計(DDD)部分核心概念的個人理解

領域驅動設計 ddd 是一種軟體設計的思考方式。它以領域為核心,分析領域中的問題,通過建立乙個領域模型來有效的解決領域中的核心的複雜問題。eric ivans為領域驅動設計提出了大量的最佳實踐和經驗技巧。只有對領域的不斷深入認識,才能得到乙個解決領域核心問題的領域模型。如果乙個應用的複雜性不是在技術...