2010-06-23 41 views
22

單獨的aggregate roots(AR)應該如何在基於DDD原則的環境中使用事件源聚合後端彼此通信?CQRS + DDD +事件採購中的彙總間通信

例如,我有一個Facility聚合根(AR),它具有負責創建Booking AR的工廠方法。 Booking是一個Person AR和Facility AR的時間敏感組合。 A Person只能預訂一個Facility

在DDD中,我會參考Booking,Person,Person,Facility。但是,當生成用於事件源的事件時,我認爲嘗試處理來自後端的事件反序列化會變得很難。因此,我已經採取只持有參考價值基於對象的唯一ID。這帶來了一個新問題,但是,當一個AR上的方法需要調用另一個AR上的另一個方法時 - 你如何處理這種情況?從域AR中打開事件源存儲庫?

這種情況下的一般用例是什麼?我接近這一切都錯了嗎?

回答

37

聚合根邊界定義了一致性邊界。 在聚合內部,保證了一致性。 外面......它不是。 所以你不應該有橫跨幾個聚合的操作,並且必須保持一致。 如果您需要跨越兩個總計的交易,您應該查看您的總計邊界。

對於在聚合之外發生的事情,您應該有一個事件處理程序,它將向其他聚合發送命令。 如果聚合之間的操作邏輯更加複雜,那麼可以定義一個進程,一個狀態機,它將偵聽事件並將命令發送給聚合。 流程可以用來定義長時間運行的事務(帶有補償而不是回滾),或者基於系統中大規模(甚至在有界的上下文之間)發生的事情來做出商業決策。

+2

好的答案 - 如果您碰巧在這個主題上尋找更深入的內容,您可能會發現這篇文章有幫助:[事件源系統中的彙總間通信](http://danielwhittaker.me/2014/11/22/ 4-祕密 - 互間聚集的通信事件來源的系統/) – Codescribler 2016-01-31 19:55:16

4

當使用Event Sourcing和CQRS時,AR間通信最優雅(至少在我看來)是消息傳遞。你可以看看Ncqrs項目(如果你是一個.NET傢伙,這會更容易),特別是'消息'分支。這個想法是,AR爲他們處理的每個消息類型實現IMessageHandler接口,而AR基類公開Send方法發送消息。藉助於此API,客戶端可以調用模型行爲,而模型本身可以進行通信(在AR之間)。