? ? ? ?基于領(lǐng)域的歸類,我們大體上有了相應(yīng)的領(lǐng)域劃分,我們將具體的領(lǐng)域歸類為核心域和支撐域以及通用域之后。那么下一步就應(yīng)該基于具體的領(lǐng)域進行相應(yīng)的限界上下文的劃分了。
? ? ? 首先限界上下文在后面具體的開發(fā)中,其實就對應(yīng)一個微服務(wù)。既一個限界上下文,就應(yīng)該有對應(yīng)的微服務(wù)做為落地。而且這個微服務(wù)不光是代碼層面的,數(shù)據(jù)層面也可以是相對獨立的。
? ? ? ?我們繼續(xù)來探討限界上下文和領(lǐng)域的關(guān)系,一般來講,一個領(lǐng)域可以有一個甚至多個限界上下文來進行管理。而且該領(lǐng)域的實體對象維護(增刪改)都僅由基于這個領(lǐng)域而劃分出來的限界上下文來進行操作維護。
? ? ?但需要注意這些限界上下文中所涉及到的實體對象可以不光只是這個領(lǐng)域的實體對象,也有可能是其他領(lǐng)域的實體對象。但對于其他領(lǐng)域的實體對象,這個限界上下文并不對這些實體對象進行維護職責(zé),這個非常重要。在這個界限上下文中,一些功能職責(zé)可能需要這些實體對象做為接口的輸入?yún)?shù)對象而已。一個例子來概述:就是A 領(lǐng)域 誕生了 A‘ 限界上下文,那么??A‘ 肯定要有維護A領(lǐng)域的實體對象的功能和方法,但?A‘ 可能也需要涉及 B領(lǐng)域的實體對象,但僅做為一些方法的參數(shù),而B 領(lǐng)域這些對象,對于?A‘ 這個限界上下文來說,就是只讀的不變的。
? ? ? 劃分限界上下文時,同時我們也需要將這個限界上下文的一些功能職責(zé)梳理出來。對于功能職責(zé)總體而言限界上下文的功能肯定是圍繞該限界上下文維護的領(lǐng)域?qū)ο蟮臉I(yè)務(wù)接口,但除此以外我們還會發(fā)現(xiàn)會有兩個比較特殊的情況出現(xiàn):
? ? ? ? 第一種情況是我們會發(fā)現(xiàn)有一類需求用例是需要跨多個領(lǐng)域,并需要將多個領(lǐng)域串聯(lián)起來進行聯(lián)動才能完成相應(yīng)的業(yè)務(wù)用例。比如支付用例,如果就有這樣流程邏輯,支付時用戶可以選擇用商戶發(fā)放給用戶的紅包進行金額抵扣。針對這個流程邏輯,我們對商戶發(fā)放的紅包和支付訂單一般來說不會設(shè)計成同一個領(lǐng)域,所以維護這兩個領(lǐng)域?qū)嶓w對象的限界上下文也肯定不是同一個,所以這個流程是多個領(lǐng)域和多個限界上下文共同串聯(lián)才能支撐起來的。
? ? ? ? 第二種情況就是在分析限界上下文除了自己維護的領(lǐng)域?qū)嶓w對象外,可能還跨別的領(lǐng)域?qū)嶓w對象(本文前面例舉探討過這個問題),實際上這個限界上下文既然依賴外部領(lǐng)域(我們將限界上下文不能維護的領(lǐng)域但需要依賴的領(lǐng)域稱為外部領(lǐng)域),也就必然在業(yè)務(wù)流程上反應(yīng)了兩個限界上下文的調(diào)用依賴性。還是拿第一種情況的案例來例舉:支付流程,需要紅包抵扣。那么這里面有營銷域(紅包)和支付域(支付)。那么維護紅包的狀態(tài)和維護支付訂單的狀態(tài)也應(yīng)該分別交給了營銷限界上下文和支付限界上下文。這里營銷限界上下文可能會發(fā)現(xiàn),我的紅包狀態(tài)變更,需要依賴于你支付域,需要支付域的訂單信息。所以這里面就存在一個時序和依賴關(guān)系。
? ? ? 為了驗證用例的完整性以及,我們一般是通過用例通過時序圖調(diào)用圖來進行相關(guān)。時序圖中的頂部節(jié)點是我們前面設(shè)計劃分好的限界上下文,通過這樣的限界上下文的串聯(lián),我們可以將一個復(fù)雜的用例,完整的表示出來。而且在業(yè)務(wù)和限界上下文的串聯(lián)我們會逐漸的清晰 一個限界上下文所擁有的內(nèi)部領(lǐng)域?qū)嶓w對象和依賴的外部領(lǐng)域?qū)嶓w對象,以及相應(yīng)的功能智能。那么我們就可以形成以下這樣一個限界上下文的范圍圖