命令處理程序是否也檢查參照完整性?這個常見問題建議你不應該在總量中檢查這個(http://cqrs.nu/Faq)。沒有檢查某些東西是否存在驗證的一部分?CQRS/DDD:檢查參照完整性
例如,您可以有一個應用程序,您可以在其中添加對文章的評論。
命令將有以下字段:
- 編號
- 條款ArticleID
- 用戶ID
- 文本
在這個例子中的評論和文章都不同aggregateroot。
如果文章已經存在並且用戶存在,你應該檢查這個例子嗎?感覺有點奇怪,你可以給不存在的文章添加評論。
命令處理程序是否也檢查參照完整性?這個常見問題建議你不應該在總量中檢查這個(http://cqrs.nu/Faq)。沒有檢查某些東西是否存在驗證的一部分?CQRS/DDD:檢查參照完整性
例如,您可以有一個應用程序,您可以在其中添加對文章的評論。
命令將有以下字段:
在這個例子中的評論和文章都不同aggregateroot。
如果文章已經存在並且用戶存在,你應該檢查這個例子嗎?感覺有點奇怪,你可以給不存在的文章添加評論。
我認爲您有理由將文章和評論分爲單獨的聚合根源。當我面對像你這樣的問題時,通常表明有機會重新考慮領域模型。
參照完整性檢查沒有任何問題,但考慮對不屬於同一根的聚合的更改的最終性質。驗證結果表明什麼?
如果文章不存在,是否因爲沒有添加文章而導致命令中存在完整性問題?或者可能它已被添加,但尚未傳播到應用程序的查詢端?或者,也許它已經在用戶發佈評論之前被刪除?
如果驗證確認文章存在,該怎麼辦?也許主持人已經將其刪除,但結果尚未傳播?
請記住,當它們發生在同一個聚合根下時,您只能依賴事件的順序。
總結:只要您意識到可能存在誤報和誤報,您就可以驗證命令處理程序中的參照完整性。如果您希望傳入的命令經常有不可靠的數據,那麼這種驗證可能會限制錯誤率。但是,如果一致性至關重要,請嘗試重新考慮您的聚合結構。
您是否應該檢查此示例,如果文章已經存在且用戶存在?
沒有通常,沒有。
這感覺有點奇怪,你可以添加評論到一個不存在的文章。
職責的分離:在域模型負責瞭解如何命令適用於模型的當前狀態。命令處理程序只是檢查命令的完整性。
同意。我只是補充說,即使域名不負責確定它是否可能會被調用,那麼肯定應該有一些可能會導致域名的問題。例如,應該檢查授權(應該允許該命令)。用同樣的方法,應該檢查執行命令是否確實可行,因爲它對於爲不存在的文章和不存在的用戶添加評論顯然是奇怪的。例如,這適用於爲不存在的客戶添加訂單。 –