聚合根源在那裏可以控制狀態變化 - 當前允許的和不允許的。如果允許狀態轉換,繼續。如果不是,你會拋出一個異常,解釋爲什麼它不被允許。Aggregate-Root:State更改或失敗,異常或...?
但什麼是如果國有變化不會發生,因爲它是已經在請求國?
例如,如果您的聚合根目錄上有Approve
方法,並且在調用該方法時狀態已被批准?
- 如果一個拋出異常一拉 「XYZ已經批准」?
- 還是應該是默默忽略?
- 還是應該狀態變化再次「發信號」(事件採購,下一段)?
在我的情況下,我使用事件源,所以如果發生狀態改變,事件正在發射。在我的事件流中發生沒有真正狀態變化的事件並不會對我感覺「乾淨」,因爲我希望確信這些事件實際上是由於改變狀態的行爲而產生的。
有沒有經驗法則?
編輯:
在所描述的情況下批准認可的元素不會真的傷害。所以傾向於這種方式(謝謝@Eben Roux,@ guillaume31)。
但是,讓我們多一點香料添加到它(這個問題背後的實際問題):
假設:
- 消息總線
- 異步命令/事件處理
- 一個進程管理器
如果進程管理器(aka saga)發出命令(異步)並想知道命令是否成功會怎麼樣?我認爲如果進程管理器不必關心關於這個實現細節,那麼減少精神負載/錯誤來源。
我看到處理3種方式是:
- 有「命令ID爲ABC成功/失敗」總線
流程管理器等待發送的該消息,而不是事件的信息 - 使命令執行同步
如果流程管理器遭遇也不例外,一切都很好,繼續前行 - 引入新的事件此事件
ApprovalDeclined { WasAlreadyApproved = true }
額外的過程管理器等待 - 磁偏角是集合歷史記錄,也許是有利的,也許根本不需要的部分...
我知道:「它取決於「
但你能想到任何其他(更優雅/更容易/不同)的解決方案嗎?處理這個問題最喜歡的「過程管理器兼容」方式是什麼?
是的,+1取決於您的域名(或者,或者常識)。 – 2014-09-30 12:18:28