2016-09-10 84 views
3

在CQRS中,驗證需要數據庫調用的命令的最佳方法是什麼? 例如,我有Order聚合,驗證命令說CommitOrder,我不想接受這個命令,除非有足夠的股票。 在這種情況下,命令處理程序如何檢查是否有訂單項的庫存或不存在?我可以從寫入端查詢讀取端嗎?需要DB調用的CQRS命令驗證

注:我使用的是阿卡實施

+0

命令可以執行查詢,但查詢無法執行命令 – CSharper

回答

7

如果總需要查詢讀取模型來執行規則驗證,那麼通常的方式做到這一點是通過域名服務 - 你傳遞給服務一個指定查詢合同的接口,該合同的實現運行查詢。

但是,您需要留意事實,即您從運行查詢得到的答案是舊的;存儲在另一個聚合中的數據不能被認爲是「最新的」。

您還應仔細檢查您的要求;在許多領域,即使庫存目前不可用,也希望接受訂單。畢竟,訂單是增加商業價值的機會;你不想在一個不相關的問題上否決這個問題。當企業已經瞭解如何減輕「缺貨」例外情況時尤其如此。

請記住,來自其他集合的數據過時 - 系統的另一部分當前正在更新庫存水平以便您可以接受訂單是完全可能的。

如果在庫存不可用時無法放鬆提交訂單的要求,並且如果使用陳舊查詢數據的錯誤率高得令人無法接受,那麼您需要重新設計合計,以便當前庫存水平爲在與訂單提交相同的一致性邊界內。

+0

感謝您的回答。是的,我同意你關於實際的商業需求和陳舊的數據。我的問題是設計問題,最終你會遇到這個查詢讀寫問題。所以我害怕擺脫依賴纏繞的方向。把命令驗證推送到一個獨立的服務,在寫入和讀取之間進行協調?如果是這樣,可以使用佐賀或我需要創建另一項服務,並保持傳奇工作流只? – Mutaz