DDD架構

1.DDD架構的概念:
領域驅動設計(Domain-Driven Design, DDD)是一種軟件設計方法,旨在將軟件系統的設計和開發焦點集中在領域模型上,以解決復雜業務問題
2.DDD架構解決了什么問題:
在以前的mvc架構種,三層結構,簡單明了。但是當項目越來越大,維護的時間久了的話,就會出現問題,各種PO,VO,DTO對象越來越多,并且會出現多個接口調用同一個VO對象
會導致實體類越來膨脹,時間久了實體類的定義越來越模糊。就變成了一屎山代碼。

而DDD是讓各個模塊盡可能的都在自己的領域包中。那樣會盡可能的減少PO VO的調用,相當于在MVC的基礎,將實體類的貧血模型,改成了充血模型。

3.DDD架構各個模塊
在這里插入圖片描述

xfg-frame-api 接口定義
其實該module更多做的是為xfg-frame-trigger提供定義好的RPC接口,但是不僅僅只有這些,還有像HTTP接口,MQ接口,甚至TASK接口都可以在xfg-frame-api中定義好,
因為xfg-frame-trigger引用了xfg-frame-api,所以會直接impl即可

xfg-frame-app 應用封裝
該module在我看來是應用啟動和配置這一層的,比如你可以設置一些基本的配置,如AOP配置,線程池配置,數據庫連接池配置等,通過整個項目的配置文件也在此處,包括 mybatis.xml 和 application.yaml等配置。這個類可以說是非常的重要,打包鏡像就是在這一層,該module引入了xfg-frame-trigger 觸發調用 和 xfg-frame-infrastructure 基礎設施,也就是說將來在打包的時候,它可以被理解為專門為了啟動服務而存在的
xfg-frame-domain 領域封裝
領域模型服務,是一個非常重要的模塊,無論怎么做DDD的分層架構,domain肯定是要存在的,那么在這一層中就要一個個的細分領域模型,也就是包含每個領域模型都要有的三大要素:“模型 倉庫 服務”。
xfg-frame-infrastructure 基礎設施|
這個層是依賴于domain領域層的,因為在domain層定義了倉庫接口 需要在基礎層實現,這是一個依賴倒置的一種設計思路。

前面說到了,在基礎層實現了domain領域的接口,實現了其對應的接口的功能,而 xfg-frame-trigger中也引用了domain,那么通過多態,實際上,那么trigger中引入的domain里的倉庫方法實際上由infrastructure 實現了
xfg-frame-trigger 觸發調用
該層相對好理解,主要用于提供接口實現,消息接收,任務執行等,相當于觸發器層,主要引入了 domain api 和 types
xfg-frame-types 類型定義
主要是作為通用類型定義層,在我們的系統開發中,會有很多類型的定義,包括基本的Response,Contants和枚舉。它們會被其他層引用。

4.領域分層
這個地方是我認為DDD的核心部分了,也就是domain部分,前面其實還是較少介紹的,只說了其包含三個部分“模型 倉庫 服務” 但是實際上包含著更多的內容,
如下圖所示:

值對象:表示沒有唯一標識的業務實體,例如商品的名稱、描述、價格等。
實體對象:表示具有唯一標識的業務實體,例如訂單、商品、用戶等;
聚合對象:是一組相關的實體對象的根,用于保證實體對象之間的一致性和完整性;

4.1依賴倒置原則
依賴倒置原則的原始定義為:高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象。其核心思想是:要面向接口編程,不要面向實現編程。依賴倒置原則是實現開閉原則的重要途徑之一,它降低了客戶與實現模塊之間的耦合

理解:高層模塊不應該直接調用底層模塊的具體實現,應該調用底層模塊的抽象,這樣當底層模塊進行修改的時候不會影響高層模塊。

4.2開閉原則
開閉原則(Open Closed Principle, OCP)是面向對象設計的基本原則之一,它要求軟件實體(如模塊、類、方法等)應當對擴展開放,對修改關閉。這意味著當軟件的需求發生變化時,我們不需要修改原有的代碼,而是通過擴展的方式來滿足新的需求。
對擴展開放:允許在不修改現有代碼的情況下增加新的功能或行為。
對修改關閉:限制對現有代碼的修改,以減少代碼的耦合性和提高系統的可維護性。

實現開閉原則的方法包括:
抽象約束,封裝變化:通過接口或抽象類定義一個相對穩定的抽象層,而將可變的部分封裝在具體實現類中。這樣,當軟件需要變化時,只需要添加新的實現類來擴展功能,而不需要修改原有的代碼。
依賴抽象而非具體實現:通過依賴抽象類或接口而不是具體實現類來編程,可以提高代碼的可復用性和可維護性。
使用設計模式:如策略模式、模板方法模式等,這些模式可以幫助我們更好地遵循開閉原則,實現代碼的靈活性和可擴展性。

5.MVC分層架構
分層架構是典型的架構例子,該架構將元素按照“層”的方式組織,每個層有定義明確的職責,同時限制了層與層之間的依賴關系。即:每一層只能依賴于緊鄰的下層或下面的任何層。以常見的三層架構為例(三層架構是應用于邏輯視圖的分層架構),三層架構將應用程序的類組織展示如圖2.1所示:

在實際開發過程中,三層架構隨著業務的逐漸龐大會出現很明顯的弊端,比如,在表示層中有邏輯層的代碼,導致在實際的三層架構模型中,下層會依賴上層,違背了三層分層機構只能上層依賴下層的原則,導致分層邊界越來越模糊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42229.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

產品經理-交互設計動手實踐(11)

業內有很多畫交互的工具,這里不過多介紹,互聯網公司最常用的工具是Axure,墨刀,藍湖,小瀑 它是一個專業的快速原型設計工具,使用它能夠快速創建線框圖、流程圖、原型和規格說明文檔。 它能快速、高效地創建原型,同時支持多人協作設…

華為HCIP Datacom H12-821 卷30

1.單選題 以下關于OSPF協議報文說法錯誤的是? A、OSPF報文采用UDP報文封裝并且端口號是89 B、OSPF所有報文的頭部格式相同 C、OSPF協議使用五種報文完成路由信息的傳遞 D、OSPF所有報文頭部都攜帶了Router-ID字段 正確答案:A 解析: OSPF用IP報…

iOS 開發中不常見的專業術語

樂此不疲地把簡單的問題復雜化,并把這種XX行為叫作專業 APM 在 iOS 開發中,APM 代表 Application Performance Management(應用性能管理)。APM 是一套監控和管理應用程序性能的工具和技術,旨在確保應用程序運行平穩、…

【人工智能】-- 法律與倫理

個人主頁:歡迎來到 Papicatch的博客 課設專欄 :學生成績管理系統 專業知識專欄: 專業知識 文章目錄 🍉引言 🍉倫理問題 🍈隱私泄露問題 🍍人工智能與隱私泄露的緊密關聯 🍍數…

上海慕尼黑電子展開展,啟明智顯攜物聯網前沿方案亮相

隨著科技創新的浪潮不斷涌來,上海慕尼黑電子展在萬眾矚目中盛大開幕。本次展會匯聚了全球頂尖的電子產品與技術解決方案,成為業界矚目的焦點。啟明智顯作為物聯網彩屏顯示領域的佼佼者攜產品亮相展會,為參展者帶來了RTOS、LINUX全系列方案及A…

測試工作流程

基礎 測試流程 1)需求研讀: 通讀需求了解需求整體內容,然后精讀需求理解需求的每?個業務邏輯,每?句話的意思。在研讀需求過程中的記錄問題,然后通過百度,AI?具,CSDN社區,咨詢朋友&#xf…

鴻蒙 arkts 實現手機號中間四位隱藏, 可以使用 substring [ 簡單適用新手 ]

1, 看效果 2, 直接cv代碼就可以 Preview Entry Component struct Setting {Statephone:string 15555555555maskPhoneNumber(phone:string){const start phone.substring(0,3)const end phone.substring(7)return ${start}****${end}}build() {Column(){Text(this.maskPhon…

Leetcode2542-最大子序列的分數

1.問題轉換 首先明確題意,要選取的值和num1,num2兩個數組都有關,但是num1中選取的是k個數,num2中選取的是1個數,顯然num2中的數所占的權重較大(對結果影響較大),所以我們就可以對nu…

【Java探索之旅】多態:向上下轉型、多態優缺點、構造函數陷阱

文章目錄 📑前言一、向上轉型和向下轉型1.1 向上轉型1.2 向下轉型 二、多態的優缺點2.1 多態優點2.2 多態缺陷 三、避免避免構造方法中調用重寫的方法四、好的習慣🌤?全篇總結 📑前言 在面向對象編程中,向上轉型和向下轉型是常用…

Django 新增數據 create()方法

1,添加模型 Test/app11/models.py from django.db import modelsclass Book(models.Model):title models.CharField(max_length100)author models.CharField(max_length100)publication_date models.DateField()price models.DecimalField(max_digits5, decim…

小米訂單銳減背后的挑戰與應對之道

近期,富士康印度子公司Bharat FIH面臨高管離職、工廠關閉的困境,其背后原因之一是小米訂單的顯著下滑,據報道,這一降幅高達70%。這一現象不僅反映了富士康在印度市場的艱難處境,也揭示了小米在全球智能手機市場面臨的挑…

六、數據可視化—Wordcloud詞云(爬蟲及數據可視化)

六、數據可視化—Wordcloud詞云(爬蟲及數據可視化) 也是一個應用程序 http://amueller.github.io/word_cloud/ Wordcloud詞云,在一些知乎,論壇等有這樣一些東西,要么做封面,要么做講解,進行分析…

C++ | Leetcode C++題解之第223題矩形面積

題目: 題解: class Solution { public:int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {int area1 (ax2 - ax1) * (ay2 - ay1), area2 (bx2 - bx1) * (by2 - by1);int overlapWidth min(ax2, bx2) - max…

實戰Qt開發WordBN筆記軟件#01 搭建開發環境:VS2019+Qt6.5+CMake+Git

01 背景 【WordBN字遠筆記】是天恩軟件工作室開發的一款免費筆記軟件;WordBN基于VS2019、Qt6.5開發,使用Qt Quick(QML)開發語言。 本課程將以【WordBN字遠筆記】的界面為實戰基礎,詳細介紹如何基于Qt/QML開發語言&am…

WPF 表格控件斑馬線使用

這里用ListView為案例。 如圖效果: 主要思路: 用AlternationCount屬性來設置需要使用斑馬線的條數,就是說幾行一換色,也可以理解為需要幾種顏色, 然后再樣式模板中,寫觸發器屬性ItemsControl.Alternatio…

python深拷貝和淺拷貝之間的區別是什么?

在Python中,深拷貝和淺拷貝是兩種不同的對象復制機制,它們在復制對象時的行為有顯著差異: 1. 淺拷貝(Shallow Copy): - 淺拷貝創建一個新對象,但它只是復制了原始對象中元素的引用(對于可變…

明明已經安裝了python中的某個庫,但是還是報錯ModuleNotFoundError: No module named ‘sklearn‘

問題: 明明已經安裝了python中的某個庫,但是還是報錯ModuleNotFoundError: No module named sklearn 解決方法: 卸載重新安裝一下即可 pip uninstall scikit-learn pip install scikit-learn 成功解決!!&#xff…

《Windows API每日一練》9.1 資源-圖標

本節講述圖標、鼠標指針位圖、字符串資源表、自定義資源的添加和應用。 本節必須掌握的知識點: 圖標 第56練:ICON圖標資源 鼠標指針位圖 字符串資源表 自定義資源 第57練:字符串資源表和自定義資源 9.1.1 圖標 在 Windows 窗口編程中&…

知識付費系統3.0整站源碼知識付費網課平臺網創資源付費帶自動采集同步插件

程序說明: 1.修復更新到最新版本 2.自動采集插件重寫 3.關閉采集授權域名直接對接 4.更新插件主動請求同步資源 5.帶自動采集插件 原始功能 支持分類替換 將主站同步過來的文章分類進行替換 支持自定義文章作者(選擇多個作者則同步到的文章作者將會隨機分…

java中==和equals()的區別探究

目錄 一、Object對象 二、 三、String類的equals()方法 四、示例 4.1直接定義兩個相同的值比較 4.2直接定義兩個值不同的字符串進行比較 4.3直接定義一個字符串和new一個字符串進行比較(兩者值相同) 4.4直接定義一個字符串和new一個字符串進行…