領域服務和領域事件如何取捨?或共存?
各位大大,當業務功能涉及到多個聚合的時候,有多種方式進行處理,其中有兩種方式使用比較普遍,一種是領域服務,另一種是領域事件,也不排除兩種同時存在的情況,那如何取捨呢?
一個系統中很多業務功能都會涉及到2個或多個聚合,如果使用領域服務,將會導致在領域層會存在大量的領域服務類,這種方式實現的效果同傳統的三層框架中的服務層實現的效果差不多,唯一區別只在於領域服務是將具體的業務邏輯放到領域物件中,而服務層是將所有的業務邏輯直接寫在服務層中;
更好的方式是採用傳送領域事件的方式,即沒有領域服務,當一個業務功能涉及到多個聚合的時候,透過同步事件來進行聚合之間的互動,拿CQRS來說,領域物件中的業務邏輯是由命令處理器來呼叫的,當一個業務設計到聚合A-->聚合B-->聚合C三個聚合,但聚合A處理完相應的業務邏輯後,修改自身狀態,然後傳送領域事件到事件匯流排,然後由事件匯流排將這個事件立即分發到聚合B,並依次到聚合C,那就意味這在聚合A執行業務邏輯之前,必須手動地將聚合B和C同時註冊到事件匯流排中(這個註冊必須在之前的命令處理器中進行),當所有業務邏輯都處理完成之後再將其進行反註冊,以取消B和C對A產生事件的關注。
不知以上我的理解有無問題?歡迎大家批評指正
一個系統中很多業務功能都會涉及到2個或多個聚合,如果使用領域服務,將會導致在領域層會存在大量的領域服務類,這種方式實現的效果同傳統的三層框架中的服務層實現的效果差不多,唯一區別只在於領域服務是將具體的業務邏輯放到領域物件中,而服務層是將所有的業務邏輯直接寫在服務層中;
更好的方式是採用傳送領域事件的方式,即沒有領域服務,當一個業務功能涉及到多個聚合的時候,透過同步事件來進行聚合之間的互動,拿CQRS來說,領域物件中的業務邏輯是由命令處理器來呼叫的,當一個業務設計到聚合A-->聚合B-->聚合C三個聚合,但聚合A處理完相應的業務邏輯後,修改自身狀態,然後傳送領域事件到事件匯流排,然後由事件匯流排將這個事件立即分發到聚合B,並依次到聚合C,那就意味這在聚合A執行業務邏輯之前,必須手動地將聚合B和C同時註冊到事件匯流排中(這個註冊必須在之前的命令處理器中進行),當所有業務邏輯都處理完成之後再將其進行反註冊,以取消B和C對A產生事件的關注。
不知以上我的理解有無問題?歡迎大家批評指正
[該貼被wilsonp於2014-06-26 15:56修改過]
相關文章
- DDD-領域物件與領域服務物件
- 領域驅動設計戰術模式--領域服務模式
- DDD領域驅動設計:領域事件事件
- 領域服務和應用服務的差別?
- 在微服務中使用領域事件微服務事件
- 結合領域事件和微服務的實現領域驅動設計 - Alagarsamy事件微服務
- 領域驅動設計戰術模式--領域事件模式事件
- 戲說領域驅動設計(廿五)——領域事件事件
- 領域服務與應用服務的職責
- 領域事件和整合事件沒那麼高大上事件
- 工位出租,場景服務領域升級
- [翻譯]-領域事件-Martin Fowler事件
- 領域驅動模型DDD(一)——服務拆分策略模型
- 領域驅動模型DDD(二)——領域事件的訂閱/釋出實踐模型事件
- Abp領域事件(EventBus)原始碼解析事件原始碼
- Java反應式事件溯源:領域Java事件
- 區塊鏈的應用領域——公共服務(三)區塊鏈
- statista:Google對雲服務領域充滿野心Go
- 《實現領域驅動設計》筆記——領域、子域和限界上下文筆記
- 到底什麼是微服務?其實就是DDD領域服務微服務
- 區塊鏈的應用領域—物聯網和物流領域(二)區塊鏈
- 如何在智慧領域創業?創業
- CloudNotes之領域建模篇:領域模型簡介Cloud模型
- 讀書系列-《解構領域驅動》-領域概念
- 多雲管理服務或成為雲端計算領域為數不多的風口
- Database Vault(DBV)和領域管理Database
- 事件風暴與領域故事的比較事件
- DDD理論學習系列(9)-- 領域事件事件
- 事件處理器中對領域的操作事件
- 新林和域服務
- Spring GraphQL與Netflix領域圖服務框架整合Spring框架
- 位元組面試:領域、子域、核心域、通用域和支撐域怎麼劃分?面試
- 微服務領域的軟體架構微服務架構
- 微服務領域驅動設計 - semaphoreci微服務
- redis在微服務領域的貢獻Redis微服務
- 人工智慧商務服務領域應用前景演講(附PPT)人工智慧
- 領域驅動設計:CQRS 和事件源的強大功能事件
- 領域事件命名的壞氣味 - Tomasz Jaskuela事件