国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

DDD架構(gòu)為什么應(yīng)該首選六邊形架構(gòu)?

這篇具有很好參考價(jià)值的文章主要介紹了DDD架構(gòu)為什么應(yīng)該首選六邊形架構(gòu)?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、傳統(tǒng)分層架構(gòu)

分層架構(gòu)的一個(gè)重要原則是:每層只能與位于其下方的層發(fā)生耦合。

分層架構(gòu)分兩種:一種是嚴(yán)格分層架構(gòu),規(guī)定某層只能與直接位于其下方的層發(fā)生耦合;另一種是松散分層架構(gòu),允許任意上方層與任意下方層發(fā)生耦合。

下圖是一個(gè)典型的DDD傳統(tǒng)分層架構(gòu)。

以上分層架構(gòu)中各層都有自己的職責(zé):

用戶接口層負(fù)責(zé)處理用戶請(qǐng)求和用戶顯示;

應(yīng)用層實(shí)現(xiàn)不同業(yè)務(wù)場景下的用例或業(yè)務(wù)流程。其中應(yīng)用服務(wù)通常接收來自用戶接口層的請(qǐng)求,然后通過資源庫獲取聚合實(shí)例,最后執(zhí)行相應(yīng)的命令操作,如下示例:

// 應(yīng)用層的用例 
public void cancelOrder(Long orderId) { 
    Order order = orderRepository.findById(orderId); 
    // 領(lǐng)域?qū)拥臉I(yè)務(wù)邏輯 
    order.cancel() 
    orderRepository.save(order); 
}

領(lǐng)域?qū)?/strong>實(shí)現(xiàn)系統(tǒng)的核心業(yè)務(wù)邏輯,主要包含基于DDD業(yè)務(wù)建模產(chǎn)生的領(lǐng)域模型,這里的業(yè)務(wù)邏輯不同于應(yīng)用層中的業(yè)務(wù)流程,如上代碼示例;

基礎(chǔ)設(shè)施層為其它各層提供通用的技術(shù)和基礎(chǔ)服務(wù),比如數(shù)據(jù)持久化功能。

二、傳統(tǒng)分層架構(gòu)的問題

DDD中資源庫(Repository)用來獲取或持久化聚合,每個(gè)聚合都擁有一個(gè)對(duì)應(yīng)的資源庫。由此可見資源庫應(yīng)該和聚合位于同一層,資源庫接口定義應(yīng)該位于領(lǐng)域?qū)樱Y源庫接口實(shí)現(xiàn)需要依賴基礎(chǔ)設(shè)施層的持久化機(jī)制,此時(shí)資源庫接口實(shí)現(xiàn)放在哪一層對(duì)傳統(tǒng)分層架構(gòu)來說是個(gè)問題。

如果把資源庫接口實(shí)現(xiàn)放在基礎(chǔ)設(shè)施層,那么基礎(chǔ)設(shè)施層就會(huì)向上依賴領(lǐng)域?qū)?,這樣就違反了分層架構(gòu)的原則:每層只能與位于其下方的層發(fā)生耦合。

或者可以放在領(lǐng)域?qū)樱沁@樣會(huì)使領(lǐng)域?qū)右蕾嚁?shù)據(jù)持久化的實(shí)現(xiàn)細(xì)節(jié),導(dǎo)致領(lǐng)域?qū)硬辉偈且粋€(gè)穩(wěn)定層。

也可以放在應(yīng)用層,不過和放在領(lǐng)域?qū)訒?huì)有同樣的問題。

那有沒有更好的方式呢?

有,采用依賴倒置,打破分層架構(gòu)原則。

三、依賴倒置原則

依賴倒置(或依賴反轉(zhuǎn))原則(Dependency inversion principle,DIP),由Bob大叔提出,其定義如下:

高層模塊不應(yīng)該依賴于低層模塊,兩者都應(yīng)該依賴于抽象。 抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。

我們把資源庫接口實(shí)現(xiàn)放在基礎(chǔ)設(shè)施層,讓基礎(chǔ)設(shè)施層向上依賴領(lǐng)域?qū)印km然這樣違背了分層架構(gòu)原則,但是卻符合依賴倒置原則:領(lǐng)域?qū)樱ǜ邔幽K)不依賴基礎(chǔ)設(shè)施層(低層模塊),兩者都依賴于資源庫接口(抽象)。采用了依賴倒置后,同時(shí)調(diào)整下基礎(chǔ)設(shè)施層位置,此時(shí)分層架構(gòu)如下圖:

四、六邊形架構(gòu)

分層架構(gòu)采用依賴倒置原則后,實(shí)際上已經(jīng)不存在分層的概念了。無論是高層還是低層,都只依賴于抽象,好像把整個(gè)分層架構(gòu)給推平了一樣。推平后的分層架構(gòu)如下圖:

給推平的分層架構(gòu)補(bǔ)上左側(cè)對(duì)稱的另一半,其結(jié)果就類似六邊形架構(gòu),如下圖是六邊形架構(gòu)。

六邊形架構(gòu)也叫端口和適配器。在這種架構(gòu)中,針對(duì)系統(tǒng)輸入輸出的不同交互方式,比如http、rpc、mq、數(shù)據(jù)持久化等,都有與之對(duì)應(yīng)的適配器,適配器又通過應(yīng)用層API與內(nèi)部進(jìn)行交互。

六邊形架構(gòu)讓應(yīng)用程序能夠以一致的方式被用戶、程序、自動(dòng)化測(cè)試、批處理腳本所驅(qū)動(dòng),而且能夠讓應(yīng)用程序的邊界更加清晰。有關(guān)六邊形架構(gòu)的詳細(xì)信息可以查看 六邊形架構(gòu)原文翻譯

五、為什么不選擇整潔架構(gòu)?

整潔架構(gòu)是Bob大叔在其《架構(gòu)整潔之道》一書中,對(duì)六邊形架構(gòu)和其他類似架構(gòu)做了總結(jié)和抽象之后,提出的一種架構(gòu)設(shè)計(jì)理念。

書中總結(jié)出,六邊形架構(gòu)和其他類似架構(gòu)設(shè)計(jì)出來的系統(tǒng),都具有相同的特點(diǎn):

獨(dú)立于框架:這些系統(tǒng)的架構(gòu)并不依賴某個(gè)功能豐富的框架之中的某個(gè)函數(shù)。框架可以被當(dāng)成工具來使用,但不需要讓系統(tǒng)來適應(yīng)框架。 可被測(cè)試:這些系統(tǒng)的業(yè)務(wù)邏輯可以脫離UI、數(shù)據(jù)庫、Web服務(wù)以及其他的外部元素來進(jìn)行測(cè)試。 獨(dú)立于UI:這些系統(tǒng)的UI變更起來很容易,不需要修改其他的系統(tǒng)部分。 獨(dú)立于數(shù)據(jù)庫:我們可以輕易將這些系統(tǒng)使用的Oracle、SQL Server替換成Mongo、BigTable、CouchDB之類的數(shù)據(jù)庫。因 為業(yè)務(wù)邏輯與數(shù)據(jù)庫之間已經(jīng)完成了解耦。 獨(dú)立于任何外部機(jī)構(gòu):這些系統(tǒng)的業(yè)務(wù)邏輯并不需要知道任何其他外部接口的存在。

綜合以上所有架構(gòu)的設(shè)計(jì)理念,Bob大叔提出了整潔架構(gòu)設(shè)計(jì)理念,如下圖。

DDD架構(gòu)為什么應(yīng)該首選六邊形架構(gòu)?

以上圖中同心圓分別代表了軟件系統(tǒng)的不同層次,通常越靠近中心,其所在的軟件層次就越高。

整潔架構(gòu)規(guī)定了層之間的依賴關(guān)系規(guī)則:內(nèi)層(高層)不依賴外層(低層),六邊形架構(gòu)層之間的依賴關(guān)系也遵從此規(guī)則。

至此可以認(rèn)為整潔架構(gòu)是一種架構(gòu)設(shè)計(jì)的指導(dǎo)思想,六邊形架構(gòu)是整潔架構(gòu)的一種具體的架構(gòu)設(shè)計(jì)。

六、總結(jié)

采用依賴倒置原則后的分層架構(gòu)和六邊形架構(gòu),實(shí)際上都符合整潔架構(gòu)設(shè)計(jì)理念。但是六邊形架構(gòu)中使用端口與適配器,讓應(yīng)用程序能夠以一致的方式被用戶、程序、自動(dòng)化測(cè)試、批處理腳本所驅(qū)動(dòng),同時(shí)能夠讓應(yīng)用程序邊界更加清晰,從而能更好地防止領(lǐng)域?qū)雍蛻?yīng)用層邏輯泄露到外層。

七、參考

1.《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》

2.《架構(gòu)整潔之道》

作者:京東零售 加文雄

來源:京東云開發(fā)者社區(qū)文章來源地址http://www.zghlxwxcb.cn/news/detail-591042.html

到了這里,關(guān)于DDD架構(gòu)為什么應(yīng)該首選六邊形架構(gòu)?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 華為云CDN為什么成為企業(yè)首選?四大優(yōu)勢(shì)助力企業(yè)騰飛

    華為云CDN為什么成為企業(yè)首選?四大優(yōu)勢(shì)助力企業(yè)騰飛

    隨著數(shù)字經(jīng)濟(jì)時(shí)代的逐步推進(jìn),越來越多的企業(yè)意識(shí)到,數(shù)字化轉(zhuǎn)型的重要性,也越來越多的企業(yè)了解到,云服務(wù)和CDN對(duì)于他們的重要。而在眾多的云服務(wù)平臺(tái)里,華為云CDN就受到了大量用戶的信任和支持,而這其實(shí)是源于華為云CDN的四大優(yōu)勢(shì)。 ? 華為云CDN究竟是什么?工作

    2024年02月06日
    瀏覽(22)
  • 使用 @Autowired 為什么會(huì)被 IDEA 警告,應(yīng)該怎么修改最佳?

    使用 @Autowired 為什么會(huì)被 IDEA 警告,應(yīng)該怎么修改最佳?

    # 問題原因 關(guān)于這個(gè)問題,其實(shí)答案相對(duì)統(tǒng)一,實(shí)際上用大白話說起來也容易理解。 1.初始化問題 先看一下Java初始化類的順序:父類的靜態(tài)字段 父類靜態(tài)代碼塊 子類靜態(tài)字段 子類靜態(tài)代碼塊 父類成員變量 父類構(gòu)造代碼塊 父類構(gòu)造器 子類成員變量 子類構(gòu)造代碼塊 子類構(gòu)

    2024年02月13日
    瀏覽(24)
  • 為什么你永遠(yuǎn)不應(yīng)該在CSS中使用px來設(shè)置字體大小

    為什么你永遠(yuǎn)不應(yīng)該在CSS中使用px來設(shè)置字體大小

    ? 代碼部署后可能存在的BUG沒法實(shí)時(shí)知道,事后為了解決這些BUG,花了大量的時(shí)間進(jìn)行l(wèi)og 調(diào)試,這邊順便給大家推薦一個(gè)好用的BUG監(jiān)控工具?Fundebug。 在Josh Collinsworth的博客文章“永遠(yuǎn)不要用px作為字體大小”中,作者討論了為什么不應(yīng)該使用像素(px)作為網(wǎng)頁字體大小的單

    2024年02月01日
    瀏覽(21)
  • Unity繪制六邊形體

    Unity繪制六邊形體

    現(xiàn)在steam上面有很多下棋類/經(jīng)營類的游戲都是用六邊形的地形,比較美觀而且實(shí)用,去年在版本末期我也自己嘗試做了一個(gè)繪制六邊體的demo,一年沒接觸unity竟然都要忘光了,趕緊在這邊記錄一下。 想cv代碼可以直接拉到代碼章節(jié) 能夠動(dòng)態(tài)生成一系列可以“挖空中心”的六邊

    2024年03月15日
    瀏覽(30)
  • puzzle(0414)六邊形拼圖

    puzzle(0414)六邊形拼圖

    目錄 六邊形拼圖 簡單 中等 困難 taptap小游戲 (3) ?? (4) ? (3) ? (4) ? ?(2) ? (3) (4) (5) 這一關(guān)沒玩出來。 找到了2個(gè)我認(rèn)為比較關(guān)鍵的塊,但是怎么放還沒確定:

    2024年02月12日
    瀏覽(28)
  • Unity UI.Image 六邊形+流光 Shader

    Unity UI.Image 六邊形+流光 Shader

    效果圖 參考代碼 ?

    2024年02月11日
    瀏覽(27)
  • ??創(chuàng)意網(wǎng)頁:如何創(chuàng)建一個(gè)漂亮的3D正六邊形

    ??創(chuàng)意網(wǎng)頁:如何創(chuàng)建一個(gè)漂亮的3D正六邊形

    ? 博主: 命運(yùn)之光 ? ?? 專欄: Python星辰秘典 ?? 專欄: web開發(fā)(簡單好用又好看) ?? 專欄: Java經(jīng)典程序設(shè)計(jì) ?? 博主的其他文章: 點(diǎn)擊進(jìn)入博主的主頁 前言: 歡迎踏入我的Web項(xiàng)目專欄,一段神奇而令人陶醉的數(shù)字世界! ?? 在這里,我將帶您穿越時(shí)空,揭開屬于

    2024年02月16日
    瀏覽(24)
  • Git文件過大我們應(yīng)該怎么辦?為什么git限制上傳文件大小不超過100M?

    Git文件過大我們應(yīng)該怎么辦?為什么git限制上傳文件大小不超過100M?

    持續(xù)學(xué)習(xí)總結(jié)輸出中,隨著我們存儲(chǔ)的文件數(shù)據(jù)越來越多,我們的Git倉庫所維護(hù)的文件大小也會(huì)越來越大。當(dāng)出現(xiàn) Git 文件過大的情況時(shí),我們應(yīng)該怎么辦呢? Git 對(duì)我們上傳的文件大小是有限制的。默認(rèn)限制最大的單文件100M,Git對(duì)單個(gè)文件的大小限制是在 100MB ~ 1GB 之間。這

    2024年02月04日
    瀏覽(32)
  • 數(shù)據(jù)分析系統(tǒng)中的六邊形戰(zhàn)士——奧威BI系統(tǒng)

    數(shù)據(jù)分析系統(tǒng)中的六邊形戰(zhàn)士——奧威BI系統(tǒng)

    數(shù)據(jù)分析軟件可以對(duì)收集的數(shù)據(jù)進(jìn)行分析和報(bào)告,幫助企業(yè)獲得更深入的數(shù)據(jù)洞察力,從而推動(dòng)企業(yè)數(shù)字化運(yùn)營決策,提高決策效率與質(zhì)量。進(jìn)入大數(shù)據(jù)時(shí)代,企業(yè)對(duì)數(shù)據(jù)分析軟件的要求也在水漲船高,傳統(tǒng)的數(shù)據(jù)分析軟件顯然已不能滿足企業(yè)大數(shù)據(jù)智能可視化分析的精細(xì)化

    2024年02月16日
    瀏覽(24)
  • Redis的速度不夠用?為什么你應(yīng)該考慮使用 KeyDB,一個(gè)更快、更強(qiáng)大、更靈活的開源數(shù)據(jù)庫

    Redis的速度不夠用?為什么你應(yīng)該考慮使用 KeyDB,一個(gè)更快、更強(qiáng)大、更靈活的開源數(shù)據(jù)庫

    你是否正在使用?Redis?作為您的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),享受它的高性能、高可用的特性?如果是這樣,那么你可能會(huì)對(duì)?KeyDB?感興趣。 KeyDB?一個(gè)由?Snap?提供支持、專為擴(kuò)展而構(gòu)建的開源數(shù)據(jù)庫。它是?Redis?的高性能分支,專注于多線程、內(nèi)存效率和高吞吐量。KeyDB?采用?MVCC?體系

    2024年02月08日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包