3

我有以下領域建模問題,我似乎最終要麼穿越一致性邊界或創建一個巨大的聚合。有人能幫我分手嗎?穿越聚合邊界

有兩種工作類型JobA,JobBJobA由任務TaskA組成。 JobB由任務TaskB組成。 JobAJobB是無關的。它們之間唯一的共同點是它們都需要設備資源。我本來想創建5個可能互相引用的聚合根 - JobA將引用TaskA等。

Domain model

我都不可能把工作和任務在一個聚合。這是以犧牲其他開銷爲代價的,因爲任務本身就是複雜的生物。但是,以下約束阻止我使用任一模型。

  1. 如果任務仍不完整,則不能標記作業。此檢查會導致交易跨越集合邊界(例如,TaskAJobA)。
  2. 設備不能分配給多個作業。該檢查將跨越兩個工作總計。
  3. 必須先釋放設備才能標記完成作業。這筆交易將跨越設備和工作總量。

擁有一個單一的聚合將把所有交易放在邊界內,但這會使聚合不可能大。在我缺少的所有這些中隱藏着不同的模型嗎?

+1

某些規則不能以實用的方式強烈一致,必須最終保持一致。 – plalx

回答

1

我認爲最好的解決方案可能是使用最終的一致性。

當我對設計集合體有疑問時,我總是看看Effective Agreggate Design by Vaughn Vernon

+0

這也是我一直在使用的:)。但無法從那裏獲得解決方案。也許我錯過了一些東西。我想到了最終的一致性,但問題在於,一個人在完成當前任務之前是不允許轉入新工作的。作業是工作流程的一部分,因此所有任務在標記完成時都要完成 - 不能讓它們在任何時候都發生不同步的情況。 – 341008

+0

我覺得你沒有遺漏任何東西。我認爲這取決於商業角度,如果他們容忍這些工作在少量時間內不同步。 –

0

我知道這個問題是很老,但我沒有看到你畫的結構和您的一致性要求的任何問題:

  1. 工作必須與他們的狀態任務列表。當任務在自己的事務中完成時,它會發送TaskCompleted事件/消息,然後作業將拾取它並在內部更新任務狀態。通過這種方式,Job可以知道是否所有任務都完成而不檢查任務彙總。

  2. 設備分配給作業必須針對設備聚合進行。這將生成EquipmentAssignedToJob事件/消息,Job聚合將使用該消息來更新其自身狀態,並顯示此作業正在使用此設備的信息。設備會知道它是否屬於自己的狀態。

  3. 工作完成動作將釋放設備。從作業中釋放設備生成可由設備和設備狀態消耗的JobFinishedUsingEquipment事件/消息將被更新爲未使用。