????????上下文映射圖并不是一種企業(yè)架構(gòu),也不是系統(tǒng)拓?fù)鋱D。但是,它可以用于高層次的架構(gòu)分析,指出注入集成平靜下來之類的架構(gòu)不足。上下文映射圖展現(xiàn)了一種組織動態(tài)能力,它可以幫助我們識別出有礙項目進(jìn)展的一些管理問題。
? ? ? ? 在DDD中,存在多種組織模式和集成模式,其中,有一種模式存在于任意兩個限界上下文之間。以下的定義在很大程度上來自于[Evans.Ref]。
1.????合作關(guān)系:如果兩個限界上下文的團(tuán)隊要么一起成功,要么一起失敗,此時他們需要建立起一種合作關(guān)系。他們需要一起協(xié)調(diào)開發(fā)計劃和集成管理。兩個團(tuán)隊?wèi)?yīng)該在接口的演化上進(jìn)行合作以同時滿足兩個系統(tǒng)的需求。應(yīng)該為互相關(guān)聯(lián)的軟件功能定制好計劃表,這樣可以確保這些功能在同一個發(fā)布中完成。
2.? ? 共享內(nèi)核:對模型和代碼的共享將產(chǎn)生一種緊密的依賴性,對于設(shè)計來說,這種依賴性可好可壞。我們需要為共享的部分模型制定一個顯式的邊界,并保持共享內(nèi)核的小型化。共享內(nèi)核具有特殊的狀態(tài),在沒有與另一個團(tuán)隊協(xié)商的情況下,這種狀態(tài)是不能改變的,我們應(yīng)該引入一種持續(xù)集成過程來保證共享內(nèi)核與通用語言的一致性。
3.? ? 客戶方-供應(yīng)方:當(dāng)兩個團(tuán)隊處于一種上游-下游關(guān)系時,上游團(tuán)隊可能獨立與下游團(tuán)隊完成開發(fā),此時下游團(tuán)隊的開發(fā)可能會受到很大的影響。因此,在上游團(tuán)隊的計劃中,我們應(yīng)該顧及到下游團(tuán)隊的需求。
4.? ? 遵奉者:在存在上游-下游關(guān)系的兩個團(tuán)隊中,如果上游團(tuán)隊已經(jīng)沒有動力提供下游之所需,西游團(tuán)隊便孤軍無助了。處于利他主義,上游團(tuán)隊可能向下游團(tuán)隊做出種種承諾,但是有很大的可能是:這些承諾是無法實現(xiàn)的。下游團(tuán)隊只能盲目地使用上游團(tuán)隊的模型。
5.? ? 防腐層:在集成兩個設(shè)計良好的限界上下文時,翻譯曾可能很簡單,甚至可以很優(yōu)雅地實現(xiàn)。但是,當(dāng)共享內(nèi)核、合作關(guān)系或者客戶方-供應(yīng)方關(guān)系無法順利實現(xiàn)時,此時的翻譯將變得復(fù)雜。對于下游客戶來說,你需要根據(jù)自己的領(lǐng)域模型創(chuàng)建一個單獨的層,該層作為上游系統(tǒng)的委派想你的系統(tǒng)提供功能。防腐層通過已有的接口與其他系統(tǒng)交互,而其他系統(tǒng)只需要做很小的修改,甚至無需修改。在防腐層內(nèi)部,它在你自己的模型和他方模型之間進(jìn)行翻譯轉(zhuǎn)換。
6.? ? 開放主機(jī)服務(wù):定義一種協(xié)議,讓你的子系統(tǒng)通過該協(xié)議來訪問你的服務(wù)。你需要將該協(xié)議公開,這樣任何想與你集成的人都可以使用該協(xié)議。在有新的集成需求時,你應(yīng)該對協(xié)議進(jìn)行改進(jìn)或者擴(kuò)展。對于一些特殊的需求,你可以采用一次性的翻譯予以處理,這樣可以保持協(xié)議的簡單性和連貫性。
7.? ? 發(fā)布語言:在兩個限界上下文之間翻譯模型需要一種公用的語言。此時你應(yīng)該使用一種發(fā)不出來的共享語言來完成集成交流。發(fā)布語言通常與開放主機(jī)服務(wù)一起使用。
8.? ? 另謀他路:在確定需求時,我們應(yīng)該做到堅決徹底。如果兩套功能沒有顯著的關(guān)系,那么他們是可以被完全解耦的。集成總是昂貴的,還有事帶給你的好處也不大。聲明兩個限界上下文之間不存在任何關(guān)系,這樣使得開發(fā)者去另外尋找簡單的,專門的方法來解決問題。
9.? ? ? 大泥球:當(dāng)我們檢查已有系統(tǒng)時,經(jīng)常會發(fā)現(xiàn)系統(tǒng)中存在混在在一起的模型,它們之間的邊界是非常模糊的,此時你應(yīng)該為整個系統(tǒng)繪制一個邊界,然后將其歸納在大泥球范圍之列。在這個邊界之內(nèi),不要試圖使用復(fù)雜的建模手段來化解問題。同時,這樣的系統(tǒng)有可能會向其他系統(tǒng)蔓延,你應(yīng)該對此保持警覺。
? ??