領(lǐng)域歉甚?
每一個系統(tǒng)都會屬于某個特定的領(lǐng)域,比如論壇是一個領(lǐng)域扑眉,用戶發(fā)帖纸泄、回帖等都是它的基本功能赖钞。同一個領(lǐng)域的系統(tǒng)都具有相同的核心業(yè)務(wù),因?yàn)樗麄円鉀Q的問題的本質(zhì)是類似的聘裁。因此雪营,一個領(lǐng)域本質(zhì)上可以理解為就是一個問題域。
領(lǐng)域驅(qū)動設(shè)計衡便?
- 領(lǐng)域驅(qū)動領(lǐng)域模型的設(shè)計
- 領(lǐng)域模型驅(qū)動代碼的實(shí)現(xiàn)
DDD 的核心是基于對領(lǐng)域的理解去設(shè)計系統(tǒng)與具體實(shí)現(xiàn)卓缰。我們只要保證領(lǐng)域模型的設(shè)計是正確的,就能確定領(lǐng)域模型可以解決領(lǐng)域中的核心問題砰诵,同理征唬,我們只要保證代碼實(shí)現(xiàn)是嚴(yán)格按照領(lǐng)域模型的意圖來落地的,那就能保證最后出來的代碼能夠解決領(lǐng)域的核心問題的茁彭,這是與傳統(tǒng)的開發(fā)模式的差異所在总寒。根據(jù)業(yè)務(wù)領(lǐng)域來驅(qū)動軟件設(shè)計,這是領(lǐng)域驅(qū)動設(shè)計的基本思想理肺。
領(lǐng)域模型的具體落地實(shí)現(xiàn)
領(lǐng)域模型的設(shè)計最終會要落地到代碼實(shí)現(xiàn)上摄闸,對于 node/egg 應(yīng)用,可以在原有的 service 層的基礎(chǔ)上進(jìn)一步細(xì)分來實(shí)現(xiàn)領(lǐng)域驅(qū)動設(shè)計的模式妹萨。
business 層
負(fù)責(zé)具體業(yè)務(wù)的組裝年枕,負(fù)責(zé)對領(lǐng)域?qū)ο蟮臉I(yè)務(wù)邏輯的組裝以及權(quán)限校驗(yàn),事務(wù)等操作乎完。domain 層
core model 負(fù)責(zé)領(lǐng)域中領(lǐng)域?qū)ο蟮亩x熏兄。這里應(yīng)該使用充血模型,將大部分的業(yè)務(wù)邏輯放在領(lǐng)域?qū)ο笾惺饕蹋瑥亩堑念I(lǐng)域?qū)ο罂梢院芎玫慕忉寴I(yè)務(wù)摩桶。而上層的 business 層只負(fù)責(zé)對業(yè)務(wù)邏輯的組裝以及權(quán)限校驗(yàn)等操作。當(dāng)業(yè)務(wù)變更的時候帽揪,需要對應(yīng)的更新領(lǐng)域?qū)ο蟆?br> core repository 作為對象的倉儲硝清。 repository 的意義是將領(lǐng)域?qū)ο蠛蛿?shù)據(jù)持久化對象之間的關(guān)系進(jìn)行抽象。對于復(fù)雜的業(yè)務(wù)转晰,可能一次業(yè)務(wù)流程包含對于一個領(lǐng)域?qū)ο蟪志没茫x取,再更新查邢,再持久化的過程蔗崎。持久化的操作本身是不屬于領(lǐng)域的一部分的,所以對于這些邏輯都可以封裝到倉儲侠坎,避免污染領(lǐng)域模型蚁趁。infrastructure 層
基礎(chǔ)設(shè)施層,包含通用的技術(shù)組件可供 domain層和 business層調(diào)用实胸,同時包含對于外部依賴的服務(wù)的封裝他嫡。如數(shù)據(jù)持久化DAL層番官,外部服務(wù)RPC調(diào)用,Redis緩存等钢属。