2011-09-08 66 views
3

我有一個問題如何處理一個傳奇,其中使 的決定取決於創建傳奇之前所公佈的一個事件。佐賀依賴於事件從過去

這是說明我的問題的示例:

想象我有一個CustomerAR和OrderAR。當customerAR是 創建了一個驗證過程開始,這個過程的結果是 量的訂單,客戶是免費無特殊 授權的花費。我不會詳細討論這個過程,因爲 它與上下文無關。在計算金額時,命令將以計算的金額 發送到CustomerAR,並且客戶AR 發佈具有該值的事件(CustomerMaxOrderAmountEvent)。所以 非常好。

然後幾個星期後,客戶下了訂單。 OrderAR是 創建並啓動我的OrderSaga。該事件等待,直到完全創建訂單 ,然後必須作出決定是否需要爲該訂單發送 AutorizationCommand。要做出該決定,必須知道如果CustomerMaxOrderAmountEvent已發佈且值爲 的金額爲 。通常OrderSaga也會訂閱 CustomerMaxOrderAmountEvent,但問題是這個事件永遠不會發生,因爲它已經在過去發生過。

我應該如何處理這個問題。我應該查詢讀取模型知道 價值,我應該發送一個命令來獲取值,我應該做一個 參考CustomerAR,我要重播所有的歷史事件 傳奇,所以他知道歷史了。

UPDATE

請注意,這是關於這個概念不是這個具體的例子。這個例子純粹是爲了澄清問題:「兩個不相關的聚合根不屬於同一個有界的上下文。」

感謝您的幫助。

梅爾文

回答

1

我會去簡單的解決方案 - 只是(在HasCustomerReachedMaxOrderAmount形式爲例)將此信息添加到啓動佐賀事件。

我會選擇第二個選項是準備讀模型設計與傳奇故事,並從那裏查詢數據可以使用,但我會收集所有的傳奇故事開始之前就所需的信息。這種充實可以由AR引發的原始事件的處理程序來執行,因爲這不是Aggregate/Bounded Context的一部分。

不過在大多數情況基礎上的事件傳遞的數據是足夠的,由於這樣的事實,傳奇故事應該只包含過程的形式業務邏輯。這通常意味着你可能會得到一個以上的佐賀(按照你的例子OrderSagaOrderWithMaxAmountSaga)。

所有這一切說,考慮到你所提供的示例場景,我認爲,爲了決定是否需要授權或不應該,而成爲你的域名本身並同時開始傳遞傳奇的一部分。

我會模擬這種情況下這樣 - CustomerAR計算最大金額;客戶下單 - >OrderAR創建時該客戶的最大金額信息,Order驗證是否需要額外授權 - >Saga開始使用。重點是關於最大金額的信息對於CustomerAR(它可以改變的地方)和OrderAR(它是不可變的)都很重要。

+0

謝謝你的回答。我同意這是針對這種特定情況的可能解決方案。但是,當兩個聚合根不屬於相同的有界環境或不具有直接關係時,情況如何呢?首先這是不可能的,但我們也希望在事件中放入不相關的數據,因爲一些傳奇需要這些數據。根據DDD,我不應該由誰來監聽或處理事件來考慮我的AR。它應該提供與事件相關的數據而不是事件的處理者。 – llMll

+0

我已更新我的回答以反映您的評論。 – kstaruch

+0

我同意你的第二個選擇。這實際上是我現在正在做的事情,但不知何故是不正確的,但我可能是錯的。我也同意這樣的事實,即我必須根據事件中的數據做出決定,但這是我想要的。只有這個活動在過去發表過。我不能完全遵循你關於多重傳奇的觀點,以及這將如何在這種情況下有所幫助。我仍然必須根據不包含我需要做出該決定的數據的事件做出決定。我希望你能爲我清除最後一點。 – llMll

0

我剛開始與DDD玩水,我不打算重複任何kstaurch說,但這裏有一些想法我已經在看你的場景:

  1. 關於做什麼最大訂單金額部分的賬單信息?這必須在某個地方得到,我相信你會照顧付款處理被拒絕的情況。

  2. 如果傳奇總是發送授權命令,但它是處理最大訂單屏幕的授權部分?如果你在說「如果金額超過$ X,那麼獲得授權」,也許你的商業模式也認爲它是「如果它在$ X以下,自動批准」。其好處是可以將全部批准考慮事項(包括是否獲得批准)轉移到批准實體或傳奇。