我深入了我的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'事件,它在处理时查找当前投票的价值,并将该用户的信誉增加该数额。更改投票的价值将只是更新查询的一种情况。当然,这只有在域本身不关心用户的实际信誉评分时才有效。 –