組織業(yè)務(wù)邏輯主要有兩種方法:面向過程的事務(wù)腳本模式和面向?qū)ο蟮念I(lǐng)域建模模式喳坠。
面向過程的事務(wù)腳本模式
這種方式的一個重要的特征就是澎现,實現(xiàn)行為的類和存儲狀態(tài)的類是分開的嫡霞。腳本通常位于服務(wù)類中麻捻,例如Order Service類误澳,使用Order Dao訪問數(shù)據(jù)庫敏沉,而數(shù)據(jù)對象Order類果正,是一個純數(shù)據(jù)類。
這種模式盟迟,適合于簡單的業(yè)務(wù)場景秋泳,如果場景變得復(fù)雜,那么代碼將變得難以維護攒菠。
面向?qū)ο蟮念I(lǐng)域建模模式
對于復(fù)雜的業(yè)務(wù)邏輯迫皱,最好使用領(lǐng)域模型模式,進行面向?qū)ο蟮脑O(shè)計辖众。
領(lǐng)域模型:將業(yè)務(wù)邏輯組織為具有狀態(tài)和行為的類構(gòu)成的對象模型卓起。
這種方式依然存在Order Service這樣的服務(wù)類,但服務(wù)類僅提供針對每個請求的方法凹炸,大量的業(yè)務(wù)邏輯以調(diào)用對象的行為完成戏阅,通常這些服務(wù)類比較簡單。
好處:
- 易于理解和維護
- 容易測試
- 面向?qū)ο蟮脑O(shè)計更容易擴展
關(guān)于領(lǐng)域驅(qū)動設(shè)計
領(lǐng)域驅(qū)動設(shè)計(Domain-Drive Design啤它,DDD)是對面向?qū)ο笤O(shè)計的改進奕筐,是開發(fā)復(fù)雜業(yè)務(wù)邏輯的一種方法私杜。
DDD中的聚合,是一個邊界內(nèi)的領(lǐng)域?qū)ο蟮募壕扰罚梢詫⑵湟暈橐粋€單元衰粹,他由根實體和可能的額一個或多個其他實體和值對象組成。例如Order聚合笆怠,就由Order實體铝耻、一個或多個OrderLineItem值對象一起其他值對象(Address,Payment Information)組成蹬刷。
聚合還闡述了加載瓢捉、更新和刪除等操作的范圍,這些操作作用于整個聚合办成,而非部分聚合泡态。聚合通常從數(shù)據(jù)庫中完整加載。
聚合的規(guī)則
- 只能引用聚合根迂卢,客戶端只能通過調(diào)用聚合跟上的方法來更新聚合某弦。
- 聚合間的引用必須使用主鍵。也可以保證聚合是松耦合的而克。
- 在一個事務(wù)中靶壮,只能創(chuàng)建或者更新一個聚合。多個聚合的更新员萍,應(yīng)該使用Saga操作腾降。
領(lǐng)域事件
領(lǐng)域事件是聚合發(fā)生的事情。它由領(lǐng)域模型中的一個類表示碎绎。Order聚合狀態(tài)變化時間包括Order Create螃壤,Order Cancelled, Order Shipped等
為什么需要領(lǐng)域事件
其他協(xié)作方筋帖,對聚合狀態(tài)的更改理张,感興趣冤竹。例如
- 服務(wù)之間的數(shù)據(jù)一致性
- 通知維護副本的服務(wù),元數(shù)據(jù)已經(jīng)變更
- 需要將狀態(tài)更新發(fā)送給用戶
怎樣識別領(lǐng)域事件
- 從需求中尋找領(lǐng)域事件
- 使用事件風(fēng)暴,識別領(lǐng)域事件和聚合
誰來發(fā)送領(lǐng)域事件
- 在服務(wù)中發(fā)送領(lǐng)域事件孝偎。在聚合狀態(tài)發(fā)生改變后判哥,返回給服務(wù)一個事件列表岔帽。服務(wù)通過依賴注入昵仅,獲取消息傳遞API的引用,使用這個引用發(fā)送事件列表中的事件梢卸。
- 聚合根在一個內(nèi)部字段中積累保存時間走诞。服務(wù)檢索這些事件。
發(fā)送領(lǐng)域事件蛤高,也需要注意可靠性蚣旱。服務(wù)需要使用事務(wù)性消息來發(fā)布事件碑幅,確保領(lǐng)域事件作為更新數(shù)據(jù)庫中聚合的事務(wù)的一部分對外發(fā)布。