我深入了我的CQRS和事件採購的第一次嘗試,並且我有幾點像某些指導一樣。我想實施一個SO風格的信譽系統。這看起來非常適合這種架構。具有CQRS和事件採購的SO風格信譽系統
以SO爲例。說一個問題upvoted這會產生一個UpvoteCommand
它增加了問題的總分和火災QuestionUpvotedEvent
。
看起來好像作者的用戶聚集應該訂閱QuestionUpvotedEvent
這可能會提高信譽評分。但是,如何/何時執行此訂閱對我而言並不清楚?在Greg Youngs的例子中,事件/命令處理在global.asax中是有線的,但這似乎並不涉及基於聚合ID的任何路由。
看起來好像每個用戶聚合都會訂閱每個QuestionUpvotedEvent
,這似乎不正確,因此要使這樣的方案有效,事件處理程序必須展示行爲以確定該用戶是否擁有剛上架的問題。 Greg Young暗示,這不應該出現在事件處理程序代碼中,這應該只涉及狀態變化。
我在這裏錯了什麼?
任何指導非常讚賞。
編輯
我想我們在這裏討論的問題是什麼&用戶聚合體之間的相互聚集的溝通。我可以看到的一個解決方案是QuestionUpvotedEvent
由ReputationEventHandler
訂閱,該ReputationEventHandler
然後可以獲取相應的用戶AR並且在該對象上調用相應的方法,例如YourQuestionWasUpvoted
。這反過來會產生用戶特定的事件,從而保留將來的重放能力。這是朝着正確的方向嗎?
EDIT 2
又見關於谷歌組here討論。
我看到了聚合訂閱事件處理程序的示例,但我認爲它確實使問題複雜化。 – madcapnmckay
我喜歡你提出的解決方案,它類似於Tom建議的解決方案,因爲外部協調器服務執行邏輯。我最初想避免的是聲譽增加的價值。我在解決方案中看到的唯一缺點是,如果我改變了提高問題的聲譽的價值,我不能輕易重新計算(如過去一樣)。根據情況你可能會看到這是一個加分,但我希望能夠重新計算。有趣的是,這引發了許多不同的解決方案(請參閱編輯)。 – madcapnmckay
我不確定您是否必須在活動中增加聲譽增加的金額?投票的價值可能只存儲在查詢端,並且您可以只有一個'UsersQuestionVotedUpEvent'事件,它在處理時查找當前投票的價值,並將該用戶的信譽增加該數額。更改投票的價值將只是更新查詢的一種情況。當然,這隻有在域本身不關心用戶的實際信譽評分時纔有效。 –