l

2020年7月7日 星期二

領域驅動設計學習筆記(8):幫Event Handler取個好命字

July 07 13:32~14:50

▲幫Event Handler取個好名字


最終一致性(Eventual Consistency)

領域驅動設計(Domain-Driven Design;DDD)引入Aggregate,更新同一個Aggregate需要保證交易處裡的一致性達到ACID要求。跨Aggregate之間則是透過領域事件通知,達到最終一致性(eventual consistency)即可。


▲圖1:Board與Workflow兩個Aggregate


以cleanKanban系統為例,圖1表示兩個Aggregate—Board與Workflow的關係,一個Board擁有零到多個Workflow。因為兩者是獨立的Aggregate,當新增Workflow之後,Board需要收到WorkflowCreated領域事件通知,才能夠建立它與Workflow之間的關係,如圖2所示。


▲圖2:Aggregate之間透過領域事件更新狀態


***

取名字

圖2是Event Storming(事件風暴)產出圖表,Event Storming定義了Domain Event、Command、Aggregate、Read Model、Policy、External System等便利貼,但是沒有代表處裡事件的Event Handler。

基本上Event Handler是一種程式實作細節,是落實Policy的實作方式。為了落實DDD的ubiquitous language in code,Teddy希望Event Storming也可以用表達Event Handler的便利貼,以便於實作時可以看著Event Storming圖表來寫程式碼。


▲圖3:新增不同顏色便利貼並直接用EventHandler當名字


Teddy一開始嘗試增加一種新顏色的便利貼,並把它貼在要透過Domain Event達到最終一致性的兩個Aggregate之間。如圖3所示,WorkflowEventHandler負責聽取WorkflowCreated領域事件,然後呼叫Commit Workflow使用案例建立起Workflow與Board之間的關係。

現在試著讀一下這個模型的通用語言:


Teddy執行Create Workflow使用案例,執行完畢後產生Workflow Created領域事件。WorkflowEventHandler一收到Workflow Created,執行Commit Workflow建立剛剛新增的Workflow與它所屬Board的關聯。


沒有留言:

張貼留言