最近在換工作,利用間隙看了兩本領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的經(jīng)典書籍:《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):軟件核心復(fù)雜性應(yīng)對之道》冰寻,《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》揣钦。
領(lǐng)域設(shè)計(jì)中的元素
限界上下文
- 限界上下文是一個(gè)顯式的邊界计贰,領(lǐng)域模型便存在于這個(gè)邊界之內(nèi)孔厉。
- 通俗來講上下文可以認(rèn)為是一個(gè)能夠獨(dú)立運(yùn)轉(zhuǎn)的模塊。同一種概念在不同上下文中可能具有不同的意義钧嘶。
- 不同上下文之間可以用RPC/REST接口訪問(使用防腐層確保上下文數(shù)據(jù)安全)棠众,或
領(lǐng)域事件
進(jìn)行通信(可以實(shí)現(xiàn)上下文更高的自治性)。` - 例:采購上下文有决,庫存上下文闸拿。
實(shí)體
- 實(shí)體是一個(gè)唯一的東西空盼,并且可以在相當(dāng)長的一段時(shí)間內(nèi)持續(xù)地變化,擁有唯一的身份標(biāo)識(shí)新荤。
- 實(shí)體不應(yīng)該是貧血的揽趾,實(shí)體擁有業(yè)務(wù)邏輯。
- Hibernate框架可以實(shí)現(xiàn)實(shí)體-數(shù)據(jù)映射迟隅。
值對象
- 值對象是一個(gè)不變的數(shù)字但骨,字符串或一種用來描述的對象励七。
- 值對象類似DTO的概念智袭。
領(lǐng)域服務(wù)
- 領(lǐng)域中的服務(wù)表示一個(gè)無狀態(tài)的操作,它用于實(shí)現(xiàn)特定于某個(gè)領(lǐng)域的任務(wù)掠抬。
- 當(dāng)某個(gè)操作不適合放在聚合和值對象上時(shí)吼野,最好的方式便是使用領(lǐng)域服務(wù)了。
- 過度使用領(lǐng)域服務(wù)可能會(huì)造成貧血模型两波。
領(lǐng)域事件
- 用來捕獲發(fā)生在領(lǐng)域中的一些事情瞳步。
- 可以用于向遠(yuǎn)程限界上下文發(fā)布領(lǐng)域事件。
- 消息的一致性實(shí)現(xiàn)腰奋,消息時(shí)延問題单起。
- 消息中間件(RabbitMQ)
聚合
- 將實(shí)體和值對象在一致性邊界之內(nèi)組成聚合。
- 設(shè)計(jì)小聚合劣坊。通過唯一標(biāo)識(shí)引用其他聚合嘀倒,避免大對象給JVM造成負(fù)擔(dān)。
- 原則上一次事務(wù)只操作一個(gè)聚合局冰,這樣服務(wù)會(huì)有更好的伸縮性和分布式特性测蘑。
- 在一個(gè)事務(wù)中操作大聚合對象,高并發(fā)時(shí)容易造成失敗康二。
工廠
- 用來創(chuàng)建模型對象碳胳,對客戶端隱藏創(chuàng)建的細(xì)節(jié)。
資源庫
- 資源庫表示一個(gè)安全的存儲(chǔ)區(qū)域沫勿,并且對其中所存放的物品起保護(hù)作用挨约。
- 存在一些額外的行為,如統(tǒng)計(jì)數(shù)量产雹。
應(yīng)用服務(wù)
- 用戶界面使用應(yīng)用服務(wù)來協(xié)調(diào)用例任務(wù)诫惭,管理事務(wù),并執(zhí)行一些必要的安全授權(quán)洽故。
心得體會(huì)
- 當(dāng)應(yīng)用程序業(yè)務(wù)邏輯越來越復(fù)雜的時(shí)候贝攒,使用面向數(shù)據(jù)開發(fā)方式會(huì)越來越吃力。無限多的條件判斷來控制不同的業(yè)務(wù)邏輯时甚,修改一個(gè)功能也不知道會(huì)引起其他業(yè)務(wù)邏輯上的問題隘弊。
- 我在項(xiàng)目的中期嘗試引入DDD哈踱,靠自己對面向?qū)ο蟮睦斫夂鸵恍┚W(wǎng)上文章的經(jīng)驗(yàn),還是收到了一些不錯(cuò)的效果:使得業(yè)務(wù)設(shè)計(jì)層面與實(shí)現(xiàn)層面能夠分離梨熙,讓應(yīng)用程序有更好的可擴(kuò)展性开镣,避免業(yè)務(wù)邏輯之間有過多的牽扯。
- 如今微服務(wù)概念流行咽扇,按DDD的方式劃分出
限界上下文
與領(lǐng)域事件
邪财,正好可以讓業(yè)務(wù)設(shè)計(jì)上天生支持微服務(wù)架構(gòu)。必要時(shí)再引入CQRS方案解決跨上下文查詢的問題质欲。 - DDD雖好也不是銀彈树埠。軟件設(shè)計(jì)是一種玄學(xué),無法簡單的判斷對錯(cuò)嘶伟,很多時(shí)候需要具體場景具體分析怎憋,達(dá)到業(yè)務(wù)抽象與性能的平衡。