mad*_*kay 3 cqrs event-sourcing
我正在进入CQRS和事件采购的第一次尝试,我有几点我喜欢一些指导.我想实现一个SO风格的声誉系统.这似乎非常适合这种架构.
以SO为例.假设一个问题被投票,这会产生一个UpvoteCommand增加问题总分并触发一个问题的问题QuestionUpvotedEvent.
似乎作者的用户聚合应该订阅QuestionUpvotedEvent可以提高声誉分数.但是,如何/何时进行此订阅对我来说并不清楚?在Greg Youngs示例中,事件/命令处理在global.asax中连接,但这似乎不涉及基于聚合ID的任何路由.
似乎每个User聚合都会订阅每个QuestionUpvotedEvent似乎都不正确的聚合,为了使这样的方案工作,事件处理程序必须展示行为以识别该用户是否拥有刚刚被投票的问题.Greg Young暗示这不应该在事件处理程序代码中,这应该只涉及状态更改.
我在这里弄错了什么?
任何指导非常感谢.
编辑
我想我们在这里讨论的是问题和用户聚合之间的聚合间通信.我可以看到的一个解决方案QuestionUpvotedEvent是由a订阅,ReputationEventHandler然后可以获取相应的用户AR并在该对象上调用相应的方法,例如YourQuestionWasUpvoted.这将反过来生成用户特定UserQuestionUpvoted事件,从而在将来保留重放能力.这个方向是朝着正确的方向发展吗?
编辑2
另请参阅此处有关Google群组的讨论.
我的理解是聚合本身不应该订阅事件.域模型仅引发事件.它是订阅事件的查询方或其他基础结构组件(例如电子邮件组件).
域服务旨在处理涉及多个聚合的用例/命令.
在这种情况下我会做什么:
VoteUpQuestionCommand的处理程序调用:
IQuestionVotingService.VoteUpQuestion(Guid questionId,Guid UserId);
然后,它会同时解决问题和用户聚合,在两者上调用相应的方法,例如user.IncrementReputation(int amount)和question.VoteUp().这会引发两件事; UsersReputationIncreasedEvent和QuestionUpVotedEvent分别由查询端处理.
| 归档时间: |
|
| 查看次数: |
573 次 |
| 最近记录: |