領(lǐng)域驅(qū)動設(shè)計:分層架構(gòu)

分層架構(gòu)是運用最為廣泛的架構(gòu)模式, 幾乎每個軟件系統(tǒng)都需要通過層來隔離不同的關(guān)注點,以此應(yīng)對不同的需要變化,使得這種變化可以獨立進(jìn)行,此外,分層架構(gòu)模式還可以用于隔離業(yè)務(wù)復(fù)雜度和技術(shù)復(fù)雜度。

Robert Martin認(rèn)為單一職責(zé)原則就是”一個類應(yīng)該只有一個引起它變化的原因”,換句話,就是如果有兩個引起類變化的原因,就需要分離。單一職責(zé)原則可以理解為架構(gòu)原則, 這里我們考慮的不是類,而且層次,這就是為什么我們需要將業(yè)務(wù)和基礎(chǔ)設(shè)施進(jìn)行分開的原因。

分層架構(gòu)演進(jìn)

分層架構(gòu)-圖1.png

左邊為傳統(tǒng)的經(jīng)典三層架構(gòu),在此基礎(chǔ)上,領(lǐng)域驅(qū)動里面提出了四層架構(gòu),由原來的業(yè)務(wù)層分為應(yīng)用層領(lǐng)域?qū)?/code>。

  • “新增的應(yīng)用層”主要負(fù)責(zé):協(xié)調(diào)對領(lǐng)域?qū)ο蟮牟僮?,分配工作,與其它系統(tǒng)的應(yīng)用層進(jìn)行交互的必要渠道, 本身不包括業(yè)務(wù)邏輯, 是非常薄的一層, 與業(yè)務(wù)用例一一對應(yīng)
  • 領(lǐng)域?qū)樱?負(fù)責(zé)表達(dá)業(yè)務(wù)概念,業(yè)務(wù)狀態(tài)信息以及業(yè)務(wù)規(guī)則。
  • 基礎(chǔ)設(shè)施層: 向其他層提供通用的技術(shù)能力, 為應(yīng)用層傳遞消息,為領(lǐng)域?qū)犹峁┏志没瘷C制,為用戶界面層繪制屏幕組件等。

分層依賴關(guān)系

分層架構(gòu)圖2.png

一般的分層架構(gòu)都是,上層依賴下層,從上自下的依賴關(guān)系, 但是DDD中,我們推薦應(yīng)該依賴抽象,而不是具體的實現(xiàn),所以領(lǐng)域?qū)硬粫苯右蕾嚮A(chǔ)設(shè)施層,而是依賴與接口,比如這里的資源庫就是接口,然后基礎(chǔ)設(shè)施層,也依賴于資源庫,并通過依賴注入或者控制反轉(zhuǎn)的方式,提供具體的底層實現(xiàn); 這樣很好的做的了技術(shù)復(fù)雜度和業(yè)務(wù)復(fù)雜度的隔離。即使底層技術(shù)實現(xiàn)細(xì)節(jié)的變更,也不會影響到領(lǐng)域?qū)印?/p>

A. 高層次的模塊不應(yīng)該依賴于低層次的模塊,它們都應(yīng)該依賴于抽象。
B. 抽象不應(yīng)該依賴于具體實現(xiàn)細(xì)節(jié),具體實現(xiàn)細(xì)節(jié)應(yīng)該依賴于抽象。
- Robert C. Martin

根據(jù)面向?qū)ο笤O(shè)計里面的依賴倒置原則,我們可以把它用于架構(gòu)設(shè)計的參考原則,其實就是面向接口的設(shè)計原則,就像構(gòu)建房屋一樣,我們需要穩(wěn)定的地基,那么在編程的世界,抽象和接口是相對穩(wěn)定的,所以我們的分層架構(gòu),可以不像傳統(tǒng)的三層架構(gòu)那樣,從上到下的進(jìn)行依賴。

分層架構(gòu)類比

image.png

洋蔥架構(gòu),六邊形架構(gòu),整潔架構(gòu),都是分層架構(gòu),他們只是更好的表達(dá)出了,領(lǐng)域邏輯處于系統(tǒng)架構(gòu)核心的位置。

比如,出名的六邊形架構(gòu),它通過內(nèi)外兩個六邊形,進(jìn)行技術(shù)復(fù)雜度和業(yè)務(wù)復(fù)雜度的隔離,這里的分層,只是名字不同,和我們上面提高的分層架構(gòu)能一一對應(yīng)上,比如領(lǐng)域模型對應(yīng)領(lǐng)域?qū)?,?yīng)用程序?qū)?yīng)應(yīng)用層,端口和適配器對應(yīng)基礎(chǔ)設(shè)施層。

同理,整潔架構(gòu)里面的enties對應(yīng)領(lǐng)域?qū)?,Use cases對應(yīng)應(yīng)用層,controllers,gateways和presenters對應(yīng)我們的基礎(chǔ)設(shè)施層。

總體來說,他們更好的表達(dá)了領(lǐng)域邏輯的核心地位。

分層架構(gòu)代碼模型

代碼模型屬于軟件架構(gòu)的一部分,通過它展現(xiàn)了模塊的劃分,我們的分層更多的是邏輯上的水平分層,體現(xiàn)在代碼上面,主要是通過包或者模塊。

image

各個層的職責(zé)和關(guān)系如下:

  1. Domain層內(nèi)要有Repository負(fù)責(zé)存取對象、Factory負(fù)責(zé)創(chuàng)建對象、Domain service負(fù)責(zé)做領(lǐng)域?qū)哟蟮臉I(yè)務(wù)
  2. Repository接口要在Domain層
  3. Repository的實現(xiàn)要在Domain層外
  4. 實現(xiàn)依賴Domain層,Domain層不依賴實現(xiàn)
  5. Application層(包括resource目錄和facade目錄)在Domain層外,不能有業(yè)務(wù)邏輯,只負(fù)責(zé)調(diào)度不同聚合的Domain service。Application service 可以依賴domain層的一切對象,但是domain層一切對象都不依賴外部對象
  6. 不同聚合的Domain不在一個包里,彼此的訪問通過Application service轉(zhuǎn)發(fā)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容