領域驅動設計:必須要理解的子領域與界限上下文

引言

領域驅動設計要進行領域劃分、界限上下文設計、上下文映射等宏觀維度的設計,本文主要對子領域、界限上下文以及上下文映射進行介紹。

領域驅動設計:必須要理解的子領域與界限上下文

子領域:Sub-Domain

領域是軟件應用所要解決的問題空間,如果能用一個統一的模型對領域進行表述看上去是合理,但往往是不現實的。最為突出的問題是同一個概念被不同的模型複用,在不同的系統區域會存在衝突和歧義,即同一概念在不同的上下文環境中可能會存在不同語義。就好比是同一個單詞,在不同的語境下意思可能不同。這也是為什麼領域驅動設計側重於通過 “分而治之” 的原則應對領域複雜性的原因。

利用“分而治之”的思想,將大問題領域分解為子領域有助於管理領域複雜性,同時可以將系統的重要組成部分與其他剩餘部分進行分離。領域驅動設計中將子領域劃分為三類:

領域驅動設計:必須要理解的子領域與界限上下文

  • 核心領域:Core Domain

核心領域是系統需要最高優先級處理的領域,是系統最為重要的部分,它是系統是否成功的關鍵所在。

  • 通用領域:Generic Domain

貫穿整個領域系統,是業務系統的公用部分,通用領域不是核心領域,一般核心領域依賴通用領域。

  • 支撐領域:Supporting Domains

支撐領域是支撐著核心域的領域。

界限上下文:Bounded Contexts

一個界限上下文(Bounded Context, 後簡稱BC)區分、封裝並定義了模型的具體職責,根據業務相關性、耦合的強弱程度、分離的關注點對這些活動進行歸類,找到不同類別之間存在的邊界,這就是限界上下文的含義。上下文(Context)是業務目標,限界(Bounded)則是保護和隔離上下文的邊界,避免業務目標的不單一而帶來的混亂與概念的不一致。每一個模型必須在一個子領域內顯示定義的上下文中, 並且每個上下文都要具備邊界,這種邊界基於具體的技術實現,界限上下文對模型進行隔離,確保單個上下文內的模型不存在語言歧義,因為,BC首先應該是一種語言邊界。

上下文間的關係: Context Mapping

除了技術細節需要考慮,還有另外一項非常重要的方面就是界限上下文之間的關係,而定義上下文映射(Context Map)就是為了解決領域上下文間的協作關係。領域驅動設計中定義上下文映射有不同的模式,比如共享內核模型、防腐層、共享主機等諸多模式,但需要說明的是,這些模式並不是具體的技術細節定義,而是表述上下文關係的一種模型,是對上下文關係的抽象表達

合作關係(Partnership)

合作模式表達了這樣一種上下文關係:

如果兩個限界上下文的團隊要麼一起成功,要麼一起失敗,此時他們需要建立起一種合作關係,他們需要一起協調開發計劃和集成管理。兩個團隊應該在接口的演化上進行合作以同時滿足兩個系統的需求。應該為相互關聯的軟件功能制定好計劃表,這樣可以確保這些功能在同一個發佈中完成。

從合作關係的表述中可以看出,這是一種強耦合的依賴關係

,兩個上下文緊緊耦合在一起。強耦合必然導致系統的擴展性下降。

共享內核(Shared Kernel)

共享內核的剝離一般是從上游上下文中進行,原來處於上游BC中的部分被多個下游BC公用,由此抽離出公共的上下文。

領域驅動設計:必須要理解的子領域與界限上下文

共享內核的優點是

降低了上下游間的直接耦合,降低上下文間的依賴關係。

共享內核模式的缺點:多個上下文都直接依賴於共享內核,這種多端依賴導致對共享內核的變更靈活性下降,可謂是“牽一髮而動全身”。每次修改,都需要對多端進行影響分析,並協調各個團隊對變更達成一致,由此必然會導致業務複雜度、技術複雜度和溝通成本的上升。

客戶方-供應方開發(Customer-Supplier Development)

正常情況下,這是團隊合作中最為常見的合作模式,體現的是上游(供應方)與下游(客戶方)的合作關係。上下游團隊對:下游提出的領域需求、通信協議、上游對協議或調用方式的變更等諸多方面進行協商。

供應方可能存在多個客戶方,因此,供應方提供服務時需要考慮服務的一致性、通用性和差異性,變更時需要注意及時與客戶方協商並達成一致。

遵奉者(Conformist)

Customer-Supplier模式是上游滿足下游的需求,而遵奉者模式是下游BC對上游BC提供的能力進行適配。這種適配不僅僅是表現在對上游服務能力追隨,還有就是對上游BC模型的遵循。

分離方式(Separate Ways)

分離表述的是這樣一種關係模式:兩個上下文間是獨立的、分離的,二者之間沒有集成或依賴。分離關係是最為理想的關係,將上下文間的耦合降到了最低。處於分離關係的上下文可以獨立演進而不影響。

防腐層(Anticorruption Layer)

不論是遵奉者模式還是客戶-供應方模式,上下文間都存在耦合,下游BC要依賴於上游BC。為了儘量降低下游對上游BC的直接依賴,在下游BC中一如一層防腐層,將下游與上游的耦合轉移到防腐層中。這種簡介層的引入,有助於隔離上游BC出現不可控變化時對下游BC造成的影響。如下圖所示,在下游BC引入防腐層:

領域驅動設計:必須要理解的子領域與界限上下文

開放主機服務(Open Host Service)

與防腐層模式相比,開放主機服務模式是在上游BC進行操作的一種隔離方式。開放主機服務一般與“Published Language”模式結合,定義公開的標準協議、通信方式等供下游調用者使用。同樣,開放主機服務模式也能有效降低了上下游間的依賴,有助於幫助上游BC對下游BC進行隔離。


分享到:


相關文章: