領域驅動設計--戰術模式簡介

戰術模式包含若干構造塊模式,以便可以構建有效的領域模型。併發

戰術模式嚴重依賴於領域模型和通用語言,經過技術模式將領域模型和通用語言中的概念映射到代碼實現中。隨着模型的進化,代碼實現也會進行重構,以更好的體現模型概念。 固然,從技術重構角度也會發現一些隱含領域知識(概念),這些新的發現也會對領域模型產生影響。框架

戰術模式和通用語言同樣,都工做在特定限界上下文內,其應用邊界受限界上下文的保護。函數

1 戰術模式

戰術模式的做用是管理複雜性並確保領域模型中行爲的清晰明確。可使用這些模式來捕獲和傳遞領域中的概念、關係、規則。設計

每一個構造塊模式都具備單一職責:cdn

  1. 表明領域中的概念。如實體、值對象、領域服務、領域事件、模塊等;
  2. 用於管理對象的生命週期。如聚合、工廠、倉庫等;
  3. 用於集成或跟蹤。領域事件、事件溯源等。

戰術模式 領域模型構造塊

1.1 領域建模模式

他們表述實現與模型間的關係,將分析模型綁定到代碼實現模型。主要用於在代碼中表述模型元素的模式。對象

1.1.1 實體

實體表述的是領域中的概念,它是由身份而不是屬性來定義的。blog

實體的身份標識在生命週期中保持不變,但其屬性會發生變化。實體以身份標識做爲惟一憑證,沿着時間軸,記錄了實體全部變動事件。接口

實體的一個實例是產品,一旦產品被生成好,其惟一身份就不會發生變化,可是其描述信息、價格等能夠被屢次修改。生命週期

實體

1.1.2 值對象

值對象表明僅經過數據區分的領域元素和概念。用做模型中元素的描述,它不具備惟一標識。事件

值對象不須要惟一標識,是由於它老是與另外一個對象相關聯,是在一個特定上下文中被解析的。一般,其生命週期會依附於它的關聯對象(在這裏,主要是實體對象)。

值對象會當作不變對象來設計,在完成建立後,其狀態就不能改變了。

值對象比較好的例子就是現金,你無需關係貨幣的身份,只關心它的價值。若是有人用一張五美圓鈔票交換你的五張一美圓鈔票,也不會改變五美圓自己。

值對象

1.1.3 領域服務

在模型中,領域服務封裝了不能天然建模爲值對象和實體的邏輯、流程和概念。

它自己不具備身份和狀態。它的職責是使用實體和值對象編排業務邏輯。

領域服務的一個好例子是運輸成本計算器,只要給出一組拖運貨物和重量,它就能計算運輸成本。

1.1.4 模塊

模塊主要用於組織和封裝相關概念(實體、值對象、領域服務、領域事件等),這樣能夠簡化對較大模型的理解。

應用模塊能夠在領域模型中促成低耦合和搞內聚的設計。

模塊做用於單個領域,用於分解模型規模。子域用於限定領域模型適用範圍(有界上下文)。

1.2 對象生命週期模式

相對來講,以前提到的模式重點在於表達領域概念。而對象生命週期模式,有點側重於技術,用於表示領域對象的建立和持久化。

1.2.1 聚合

實體和值對象會相互協做,造成複雜的關聯關係。咱們須要在知足不變條件的前提下,將其拆分爲一個個概念上的總體。

一般,面對複雜的對象關係,在執行領域對象操做時,難以保證一致性和併發性。

領域驅動設計由聚合模式來確保操做的一致性和事務的併發邊界。大模型會經過不變性條件來劃分,並組成概念化總體的實體和對象組,這個概念化總體即是聚合。

聚合根之間的關係應該經過保持對另外一個聚合根 ID 的引用,而非對對象自己的引用來實現。這一原則有助於保持聚合之間的邊界並避免加載沒必要要的對象。

不變性,是在領域模型中強制實現一致性的規則。不管什麼時候對實體或聚合進行變動都要應用該業務規則。

聚合外部的對象只能引用另外一個聚合的聚合根,聚合中對象的任何變動都須要經過聚合根來完成。聚合根封裝聚合數據並公開行爲以對其進行修改。

聚合

1.2.2 工廠

若是實體或值對象的建立過程很是複雜,能夠將其委託給工廠。工廠會確保在領域對象使用以前就知足全部的不變條件。

若是領域對象很簡單而且不具備特殊的不變條件,可使用構造函數代替工廠。當從持久化存儲中重建領域對象時,也可使用工廠。

工廠

1.2.3 倉庫

倉庫主要用於持久化一個聚合。將聚合做爲原子單元進行處理,所以,倉庫操做的最小單元就是聚合,每一個聚合會對應一個倉庫。

倉庫

倉庫是用來檢索和存儲聚合的機制,是對基礎框架的一種抽象。

1.3 其餘模式

1.3.1 領域事件

領域事件表示問題空間中發生了一些業務人員關心的事情。主要用於表示領域概念。

使用領域事件主要有如下兩種場景:

  1. 記錄模型的變動歷史;
  2. 做爲跨聚合通訊方式。
1.3.2 事件溯源

傳統的僅快照式持久化的一個替代項即是事件溯源。做爲實體狀態存儲的替代,能夠存儲引起該狀態的系列事件。

存儲全部的事件會提升業務的分析能力,不只能夠得知實體當前狀態,還能夠得知過去任意時點的狀態。

事件溯源

1.4 總結

  1. 實體
    • 由惟一標識符定義
    • 標識符在整個生命週期保存不變
    • 基於標識符進行相等性檢查
    • 經過方法對屬性進行更新
  2. 值對象
    • 描述問題域中的概念和特徵
    • 不具有身份
    • 不變對象
  3. 領域服務
    • 處理沒法放置在實體或值對象中的領域邏輯
    • 無惟一標識
    • 無狀態服務
  4. 模塊
    • 分解、組織和提升領域模型的可讀性
    • 命名空間,下降耦合,提供模型高內聚性
    • 定義領域對象組間的邊界
    • 封裝比較獨立的概念,是比聚合、實體等更高層次的抽象
  5. 聚合
    • 將大對象圖分解成小的領域對象羣,下降技術實現的複雜性
    • 表示領域概念,不只僅是領域對象集合
    • 肯定領域一致性邊界,確保領域的可靠性
    • 控制併發邊界
  6. 工廠
    • 將對象的使用和構造分離
    • 封裝複雜實體和值對象的建立邏輯
    • 保障複雜實體和值對象的業務完整性
  7. 倉庫
    • 是聚合根在內存中的集合接口
    • 提供聚合根的檢索和持久化需求
    • 將領域層與基礎實施層解耦
    • 一般不用於報告需求
  8. 領域事件
    • 業務人員所關心的事件,是通用語言的一部分
    • 記錄聚合根的全部變動
    • 處理跨聚合的通訊需求
  9. 事件溯源
    • 使用歷史事件記錄替換快照存儲
    • 提供對歷史狀態的查詢
相關文章
相關標籤/搜索