Golang領(lǐng)域模型-依賴倒置

前言:為什么要用整篇文章來寫好像跟領(lǐng)域模型干系不大的《依賴倒置》呢羊初?因?yàn)椤兑蕾嚨怪谩肥橇呅渭軜?gòu)的核心滨溉!毫不夸張的說,不理解《依賴倒置》的程序員只能寫功能长赞,沒法寫出框架來晦攒!不論是依賴注入di或者依賴倒置dip,全部都是根據(jù)當(dāng)前成員變量的類型得哆,框架自動(dòng)注入實(shí)例的脯颜。區(qū)別在于成員變量是指針接收還是接口接收。具體如何自動(dòng)注入贩据,請(qǐng)看<<六邊形架構(gòu)>>和<<資源庫(kù)>>章節(jié)栋操。

一、如果不進(jìn)行依賴倒置會(huì)怎樣饱亮?

我們先看看什么是依賴倒置矾芙,教科書式的解釋就是:

  • 高層模塊不應(yīng)依賴于低層模塊,二者應(yīng)依賴于抽象近上。
  • 抽象不應(yīng)依賴于細(xì)節(jié)剔宪,細(xì)節(jié)應(yīng)依賴于抽象。

我們商品領(lǐng)域服務(wù)需要使用Repository來持久化數(shù)據(jù)戈锻,中二代碼寫成這樣:

代碼示例

  1. 資源庫(kù)具體實(shí)現(xiàn)基礎(chǔ)設(shè)施(DB)的功能


    外部資源的實(shí)現(xiàn)
  2. 領(lǐng)域模型依賴資源庫(kù)


    直接依賴repository
  3. 領(lǐng)域模型直接使用以來的資源庫(kù)實(shí)現(xiàn)


    使用repository的實(shí)現(xiàn)

這樣做的缺點(diǎn)是什么歼跟?

  1. 難以維護(hù)
    內(nèi)部(領(lǐng)域模型)通常是業(yè)務(wù)邏輯和策略,這里就是DDD里面的領(lǐng)域模型格遭,一個(gè)軟件區(qū)別于其他軟件的核心就在于業(yè)務(wù)邏輯和策略實(shí)現(xiàn)(也就是領(lǐng)域模型),而外部更多的是外部資源等基礎(chǔ)設(shè)施留瞳。PS:內(nèi)部外部概念可參考前文---《Golang領(lǐng)域模型-六邊形架構(gòu)》

如果領(lǐng)域模型依賴基礎(chǔ)設(shè)施拒迅,那就是業(yè)務(wù)邏輯依賴技術(shù)細(xì)節(jié),技術(shù)細(xì)節(jié)的改變將會(huì)對(duì)業(yè)務(wù)邏輯產(chǎn)生影響她倘,使其不得不改變璧微。這樣是不合理的。

  1. 復(fù)用困難
    越核心的領(lǐng)域模型硬梁,復(fù)用價(jià)值越高前硫,如果對(duì)基礎(chǔ)設(shè)施進(jìn)行依賴,那么復(fù)用將會(huì)變得很困難荧止。

二屹电、如何進(jìn)行依賴倒置阶剑?

計(jì)算機(jī)科學(xué)中的所有問題都可以通過引入一個(gè)間接層得到解決。
All problems in computer science can be solved by another level of indirection
—— David Wheeler

實(shí)現(xiàn):domain中引入dependency包定義抽象層

dependency抽象層

代碼示例:

  1. 定義了商品倉(cāng)儲(chǔ)實(shí)現(xiàn)所需要滿足的接口危号。


    抽象層
  2. 商品領(lǐng)域服務(wù)成員變量直接引用抽象接口牧愁,框架負(fù)責(zé)依賴注入

領(lǐng)域模型依賴抽象
  1. 商品領(lǐng)域模型中使用抽象出來的GoodsRepo方法
領(lǐng)域模型依賴抽象
  1. 外部資源具體實(shí)現(xiàn)抽象接口


    外部資源具體實(shí)現(xiàn)抽象接口

注意: var _ dependency.GoodsRepo = new(Goods) 我們用來檢查是否實(shí)現(xiàn)了接口

三艾凯、六邊形架構(gòu)核心-依賴倒置

前面講完基礎(chǔ)茫蛹,現(xiàn)在開始上大戲了迹炼!

為什么說六邊形架構(gòu)的核心是依賴倒置刀闷?

因?yàn)榱呅渭軜?gòu)不分高低層情连,而分內(nèi)外部幔嗦,嚴(yán)格的將基礎(chǔ)設(shè)施和領(lǐng)域模型分割開來锋恬。領(lǐng)域模型實(shí)現(xiàn)很簡(jiǎn)單桶蝎,但是將領(lǐng)域模型與DB声邦,Redis乏奥,MQ等基礎(chǔ)設(shè)施連接起來卻很困難。

如何連接翔忽?依賴倒置英融!

  1. main函數(shù)中安裝基礎(chǔ)設(shè)施kafka
安裝kafka
  1. 實(shí)體中抽象領(lǐng)域事件接口
抽象領(lǐng)域事件接口
  1. kafka實(shí)現(xiàn)領(lǐng)域事件接口
實(shí)現(xiàn)領(lǐng)域事件接口
  1. 訂單實(shí)體發(fā)送領(lǐng)域事件
發(fā)送領(lǐng)域事件

依賴倒置的變與不變

通過第一、二小結(jié)概念的理解歇式,觀察第三小結(jié)的代碼驶悟。

Kafka是個(gè)優(yōu)秀的消息隊(duì)列中間件,它雖然很好材失,但只是基礎(chǔ)設(shè)施痕鳍,不是系統(tǒng)的核心部分,也許不久的某一天我們就會(huì)把它替換掉龙巨。亦或是替換掉別的中間件~

如果沒有依賴倒置怎么辦笼呆?
修改業(yè)務(wù)代碼?將所有用到過kafka的地方全部重新寫一遍旨别?下次有變化繼續(xù)寫诗赌?程序員聽了想打人!

有了依賴倒置怎么辦秸弛?

  1. 新的中間件只需要實(shí)現(xiàn)領(lǐng)域事件接口铭若。
  2. 在main中重新安裝。

這就是依賴倒置的魅力递览,沒有什么是不變的叼屠,重要的是將領(lǐng)域模型與基礎(chǔ)設(shè)施解耦開來。這樣替換只需要重寫領(lǐng)域事件绞铃,讓領(lǐng)域模型保持相對(duì)穩(wěn)定镜雨,不會(huì)隨著基礎(chǔ)設(shè)施的變化而被動(dòng)變化。

四儿捧、品一品

細(xì)品以上兩種代碼荚坞,第二種實(shí)現(xiàn)方式中挑宠,領(lǐng)域模型沒有像原來一樣直接依賴外部資源,而是將依賴關(guān)系“倒置”過來西剥,讓基礎(chǔ)設(shè)施去依賴由領(lǐng)域模型定義好的接口痹栖。

回前言所問,為什么要用一篇文章來解釋依賴倒置瞭空,這就是六邊形的核心揪阿,外部依賴內(nèi)部,內(nèi)部倒置基礎(chǔ)設(shè)施---freedom咆畏!

總結(jié)一下:

常用的實(shí)現(xiàn)方式是基礎(chǔ)設(shè)施有自己的接口南捂,領(lǐng)域模型依賴基礎(chǔ)設(shè)施提供的接口,比如基礎(chǔ)設(shè)施有自己的接口旧找,領(lǐng)域模型依賴基礎(chǔ)設(shè)施的接口溺健,這樣直接依賴的實(shí)現(xiàn)方式。

但是按照依賴倒置的原則钮蛛,接口的所有權(quán)是被倒置的鞭缭,表現(xiàn)在于接口是被領(lǐng)域模型的,領(lǐng)域模型擁有接口的所有權(quán)魏颓,基礎(chǔ)設(shè)施實(shí)現(xiàn)接口岭辣。這樣基礎(chǔ)設(shè)施的改動(dòng)不會(huì)影響領(lǐng)域模型,領(lǐng)域模型的復(fù)用不會(huì)依賴基礎(chǔ)設(shè)施甸饱。

1.依賴于構(gòu)建出來的抽象沦童,而不是具體類。
2.依賴倒置的關(guān)鍵是接口所有權(quán)的倒置叹话。

目錄

  • golang領(lǐng)域模型-開篇
  • golang領(lǐng)域模型-六邊形架構(gòu)
  • golang領(lǐng)域模型-實(shí)體
  • golang領(lǐng)域模型-資源庫(kù)
  • golang領(lǐng)域模型-依賴倒置
  • golang領(lǐng)域模型-聚合根
  • golang領(lǐng)域模型-CQRS
  • golang領(lǐng)域模型-領(lǐng)域事件

項(xiàng)目代碼 https://github.com/8treenet/freedom/tree/master/example/fshop

PS:關(guān)注公眾號(hào)《從菜鳥到大佬》偷遗,發(fā)送消息“加群”或“領(lǐng)域模型”,加入DDD交流群驼壶,一起切磋DDD與代碼的藝術(shù)氏豌!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市热凹,隨后出現(xiàn)的幾起案子箩溃,更是在濱河造成了極大的恐慌,老刑警劉巖碌嘀,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異歪架,居然都是意外死亡股冗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門和蚪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來止状,“玉大人烹棉,你說我怎么就攤上這事∏影蹋” “怎么了浆洗?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)集峦。 經(jīng)常有香客問我伏社,道長(zhǎng),這世上最難降的妖魔是什么塔淤? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任摘昌,我火速辦了婚禮,結(jié)果婚禮上高蜂,老公的妹妹穿的比我還像新娘聪黎。我一直安慰自己,他們只是感情好备恤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布稿饰。 她就那樣靜靜地躺著,像睡著了一般露泊。 火紅的嫁衣襯著肌膚如雪喉镰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天滤淳,我揣著相機(jī)與錄音梧喷,去河邊找鬼。 笑死脖咐,一個(gè)胖子當(dāng)著我的面吹牛铺敌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屁擅,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼偿凭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了派歌?” 一聲冷哼從身側(cè)響起弯囊,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胶果,沒想到半個(gè)月后匾嘱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡早抠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年霎烙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悬垃,死狀恐怖游昼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尝蠕,我是刑警寧澤烘豌,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站看彼,受9級(jí)特大地震影響廊佩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闲昭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一罐寨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧序矩,春花似錦鸯绿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至租幕,卻和暖如春舷手,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背劲绪。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工男窟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贾富。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓歉眷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親颤枪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汗捡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348