2017-02-28 37 views
0

我有一段時間以來一直在思考的問題,我沒有找到一個好的解決方案。它關於CQRS和域邊界。命令執行中的額外邊界數據

假設我有一個背景,那就是關於爲系統進行預訂並最終發生事件。該系統允許將單個預訂鏈接到單個事件(已完成,沒有問題),並將每週預訂與一系列事件相關聯。每週預訂定義一週中的某一天(額外數據不相關);每週預訂總是有開始和結束的一天(半年)。

該系統還具有兩種類型的天:平常的日子,而不是工作日,其中不能舉辦的活動。

作爲一個企業要求用戶希望,每一週預約制單會取消上不工作日內保持特定事件。

其實預訂和事件存儲在兩個表中。存儲特殊標誌時會取消事件。我與時間表沒有關係,因爲我從未在商業環境中使用過它。作爲商業界限(與其他小數據,這裏不相關),到目前爲止,這是非常有效的。

這裏是我的問題:滿足用戶請求(創造每一天刪除的事件),我需要大約半年的日子信息(只是在同一個工作日的那些足夠)。但是,要獲得這些信息,我該如何繼續?

我可能的解決方案:

  1. 加載所有根實體半年的日子。這可能非常沉重,我必須擴展我的業務範圍。
  2. 預處理該命令,創建一個具有額外信息的命令。這將是一個命令命令,我讀過的東西很危險。對我而言足夠了。
  3. 使用無效天數列表擴展命令。我如何檢查一天是無效的?我必須訪問我的實際邊界以外的數據,這與1相同。
  4. 創建在命令處理程序中使用的服務以獲取非工作日的列表。天上下文信息將在共同(或共享)上下文中移動。
  5. 爲每週事件創建​​一個事件監聽器。創建每週事件時,它會加載非工作日的列表(針對該半年的那個工作日),並觸發一系列命令來取消特定日期。這將封閉邊界,不會將額外的數據添加到常見的上下文中,並重復使用相同的代碼(取消事件)以實現額外目的。

這將是最好的解決辦法?

回答

1

試金石:問你的利益相關者,如果它曾經發生這樣的工作日變成一個非工作日的,什麼是應該發生在那些日子每週預訂。此外,它是否發生過一個非工作日成爲工作日,以及這些天的預定會發生什麼。

創建每週事件的事件偵聽器。創建每週事件時,它會加載非工作日的列表(針對該半年的那個工作日),並觸發一系列命令來取消特定日期。這將封閉邊界,不會將額外的數據添加到常見的上下文中,並重復使用相同的代碼(取消事件)以實現額外目的。

關閉,根據我對你所寫的內容的理解。

在我看來,你真的有兩種不同的聚集體;你有每週預訂的定義,並且你有每天收集不同預訂活動的時間表。

當你創建一個預訂,你輸入的開始日期和結束日期,星期幾,大概一個域中的服務,可以在這個範圍內返回星期天的列表。考慮時間表或行程 - 我們正在定義此特定預訂的候選日期。

您事件偵聽器,在看到一個新的預訂,火災的時間表總該日期的命令,將通過每天的預訂請求的事件。因爲時間表知道它是否是「非工作日」,所以它可以將每個事件標記爲預定或取消(如果你希望這些信息是明確的;你可以將它隱含在工作日的狀態中在一些系統中)。

空的時間表可以提前按需使用一些通用的配方,以確定它們是否是工作日,並且可以支持改變自己的工作狀態,如果這是你的當前域的一部分來創建,或。

的關鍵思想在這裏是不工作的日子是你的域模型的一部分,因爲它們跨越多個預訂的對象,他們顯然是坐在預訂總量之外的實體。

+0

因此,如果我理解正確的話你的建議,最後的選擇是最好的一個。兩個聚合,有兩個不同的目的,以及一個事件監聽器,用「不允許事件」列表「更新」每週預訂。 –