[英]Event Sourcing: where to put business logic
我可以想到兩個地方將域邏輯放在事件源系統中,或者有一個缺點。
示例 :根據某些數據計算指標。
要么我必須計算兩次指標(在域模型中一次,在投影中一次)
或者我必須在發送活動之前計算它並將其包含在那里。
控制流程通常如下:
聚合方法必須確保其參數和聚合狀態相互允許執行操作。
然后,Aggregate方法創建一個事件並調用此When
或Apply
方法來處理事件
事件處理程序只改變聚合狀態,沒有邏輯!
進一步行動與預測有關。
在應用事件之前將不變保護(即業務邏輯)放入聚合事件的原因是因為生成事件時沒有回頭路。 這件事已經發生了。 你不能拒絕申請活動。 考慮從事件流中恢復聚合時重放事件(從存儲庫讀取),如果有一天你決定在那里使用if-throw
組合,那么這可能會如何工作?
簡而言之:
沒有人說事件采購會幫助你解決計算中的問題。 要創建一個額外的安全網,您可能希望保存命令,但是您必須發出補償事件或截斷流,這實際上並不是您想要做的。
我想你的Aggregate Root中有一些狀態。 這應包含有關您業務的邏輯。 因此它應該有足夠的數據來基於命令創建事件。
此事件的消費者(查詢模型)進行計算。 因此,如果意圖是計算平均值,則必須設法以給定方式存儲自身。
我做了類似的事情。 一旦它成為業務邏輯的一部分,它就在Aggregate中,一旦它在Query模型中,因為它不是業務邏輯的一部分,而是更多的度量計算。
不要害怕將數據存儲在多個地方。 一致性的責任應該委托給事件分發,而不是您的業務邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.