2017-06-04 36 views
1

在Red Book Vernon模型中將BacklogItem和Sprint實體作爲單獨集合。我看到了這種方法的優點,但有一種情況是我無法擺脫困境。例如,我需要我的Sprint聚合來執行最大項目分配限制。此外,BacklogItem必須意識到assigment的事實,以確保它不被分配給多個Sprint。因此,將BacklogItem分配給Sprint會在一個事務中更改兩個聚合,這不是我們想要做的事情。我看不到任何解決此問題的好方法。展開聚合意味着讓BacklogItem Sprit的內部部分。由於在其他聚集內使用它(Release,Schedule),這沒有任何意義。我提出的另一種方法是使用最終的一致性,並提醒管理員關於BacklogItem的雙重分配。但我認爲它是重要的總體不變量,我希望獲得明確的強加的機會。兩個集合和一個事務 - 紅皮書示例

回答

2

我想到的另一種方法是使用最終的一致性,並提醒管理員關於BacklogItem的雙重分配。

我的猜測是這是正確的答案。

我需要我的Sprint聚合來執行最大項目分配限制。

您可能忽略了一個重要的考慮因素:誰決定將哪些BacklogItems添加到Sprint中?這是模型爲自己做出的決定,還是由人類(或模型外的其他實體)做出的決定?

因爲大多數情況下,模型不應該放棄由操作人員做出的決定;它不應該迫使人類操作員通過背景轉換跳過模型的箍環。

如果我們事先知道我們超出Sprint項限制,那麼沒有必要運行該命令。如果命令處理程序執行該檢查:$ sprint-> hasSpaceFor($ item);不會被認爲是知識泄露?

這裏有幾件事情需要考慮。

一個是不是彙總部分的數據是陳舊;可能會有另一個命令處理程序在您檢查數據時更改該數據。這並不意味着檢查它是錯誤的,但它確實意味着在命令處理程序中檢查它並不比在其他地方檢查更好。

其次,對不變量的檢查取決於消息到達的順序。操作人員可能決定從sprint中刪除一個項目,爲新的項目騰出空間 - 但是如果消息的順序在運輸過程中發生變化(不可靠的消息傳輸),那麼模型最終會拒絕應該是有效的命令。這不好。

或者,消息可能按照它們被調度的順序到達。人類操作員知道這兩種操作會被抵消,因此應該如何處理這些操作並不重要 - 但該模式堅持認爲這些決定應以特定順序報告。這是箍跳 - 模型讓工作更加艱難,而不是更容易。

此外,價值到業務獲得正確的項目進入衝刺可能比找出哪一個要刪除更有價值。重要見解:人類操作員正在處理業務優先級現在,但生產中運行的模型反映了寫入時的優先級 - 換句話說,該模型捕獲了過去的優先級。所以你要小心讓模型否決運營商。

更重要的是,您想要了解在從操作人員那裏獲得的信息被否決時業務價值是如何派生的,並決定應該在哪裏管理責任 - 也許這是UI關注的問題(試圖降低高數據錄入錯誤的成本?),而不是一個領域模型問題。

+0

這是偉大的洞察力!你徹底正確:)但這導致另一個考慮。爲了這個對話的需要,讓我們假設我在BackLogItem聚合根上運行我的命令: – ayeo

+0

$ item-> assignToSprint($ sprint); 後鎖項目將檢查它是否未分配給其他衝刺。但應該進行另一次檢查。如果我們事先知道我們超出Sprint項目限制,那麼運行該命令就毫無意義。如果命令處理程序將執行該檢查: $ sprint-> hasSpaceFor($ item); 不會被視爲知識泄漏嗎? – ayeo

+0

我同意VoiceOfUnreason所說的一切。基本上,你的sprint聚合可以只有一個參數來報告它是否溢出。這可以在UI中用於通知用戶,但不應該在其他地方。對於關閉衝刺,這可以拒絕,如果在那一點仍然打開項目。確定物品關閉的可能性仍然存在,但要求關閉所有物品是合理的。 另一方面,如果您正在移動一個sprint中已有的積壓件,那麼您的命令可以是'MoveBacklog'並且需要一個源和目標Sprint。 – Arwin

相關問題