戰術模式包含若干構造塊模式,以便可以構建有效的領域模型。併發
戰術模式嚴重依賴於領域模型和通用語言,經過技術模式將領域模型和通用語言中的概念映射到代碼實現中。隨着模型的進化,代碼實現也會進行重構,以更好的體現模型概念。 固然,從技術重構角度也會發現一些隱含領域知識(概念),這些新的發現也會對領域模型產生影響。框架
戰術模式和通用語言同樣,都工做在特定限界上下文內,其應用邊界受限界上下文的保護。函數
戰術模式的做用是管理複雜性並確保領域模型中行爲的清晰明確。可使用這些模式來捕獲和傳遞領域中的概念、關係、規則。設計
每一個構造塊模式都具備單一職責:cdn
他們表述實現與模型間的關係,將分析模型綁定到代碼實現模型。主要用於在代碼中表述模型元素的模式。對象
實體表述的是領域中的概念,它是由身份而不是屬性來定義的。blog
實體的身份標識在生命週期中保持不變,但其屬性會發生變化。實體以身份標識做爲惟一憑證,沿着時間軸,記錄了實體全部變動事件。接口
實體的一個實例是產品,一旦產品被生成好,其惟一身份就不會發生變化,可是其描述信息、價格等能夠被屢次修改。生命週期
值對象表明僅經過數據區分的領域元素和概念。用做模型中元素的描述,它不具備惟一標識。事件
值對象不須要惟一標識,是由於它老是與另外一個對象相關聯,是在一個特定上下文中被解析的。一般,其生命週期會依附於它的關聯對象(在這裏,主要是實體對象)。
值對象會當作不變對象來設計,在完成建立後,其狀態就不能改變了。
值對象比較好的例子就是現金,你無需關係貨幣的身份,只關心它的價值。若是有人用一張五美圓鈔票交換你的五張一美圓鈔票,也不會改變五美圓自己。
在模型中,領域服務封裝了不能天然建模爲值對象和實體的邏輯、流程和概念。
它自己不具備身份和狀態。它的職責是使用實體和值對象編排業務邏輯。
領域服務的一個好例子是運輸成本計算器,只要給出一組拖運貨物和重量,它就能計算運輸成本。
模塊主要用於組織和封裝相關概念(實體、值對象、領域服務、領域事件等),這樣能夠簡化對較大模型的理解。
應用模塊能夠在領域模型中促成低耦合和搞內聚的設計。
模塊做用於單個領域,用於分解模型規模。子域用於限定領域模型適用範圍(有界上下文)。
相對來講,以前提到的模式重點在於表達領域概念。而對象生命週期模式,有點側重於技術,用於表示領域對象的建立和持久化。
實體和值對象會相互協做,造成複雜的關聯關係。咱們須要在知足不變條件的前提下,將其拆分爲一個個概念上的總體。
一般,面對複雜的對象關係,在執行領域對象操做時,難以保證一致性和併發性。
領域驅動設計由聚合模式來確保操做的一致性和事務的併發邊界。大模型會經過不變性條件來劃分,並組成概念化總體的實體和對象組,這個概念化總體即是聚合。
聚合根之間的關係應該經過保持對另外一個聚合根 ID 的引用,而非對對象自己的引用來實現。這一原則有助於保持聚合之間的邊界並避免加載沒必要要的對象。
不變性,是在領域模型中強制實現一致性的規則。不管什麼時候對實體或聚合進行變動都要應用該業務規則。
聚合外部的對象只能引用另外一個聚合的聚合根,聚合中對象的任何變動都須要經過聚合根來完成。聚合根封裝聚合數據並公開行爲以對其進行修改。
若是實體或值對象的建立過程很是複雜,能夠將其委託給工廠。工廠會確保在領域對象使用以前就知足全部的不變條件。
若是領域對象很簡單而且不具備特殊的不變條件,可使用構造函數代替工廠。當從持久化存儲中重建領域對象時,也可使用工廠。
倉庫主要用於持久化一個聚合。將聚合做爲原子單元進行處理,所以,倉庫操做的最小單元就是聚合,每一個聚合會對應一個倉庫。
倉庫是用來檢索和存儲聚合的機制,是對基礎框架的一種抽象。
領域事件表示問題空間中發生了一些業務人員關心的事情。主要用於表示領域概念。
使用領域事件主要有如下兩種場景:
傳統的僅快照式持久化的一個替代項即是事件溯源。做爲實體狀態存儲的替代,能夠存儲引起該狀態的系列事件。
存儲全部的事件會提升業務的分析能力,不只能夠得知實體當前狀態,還能夠得知過去任意時點的狀態。