gpt4 book ai didi

cqrs - 带有 CQRS 和事件溯源的 SO 风格声誉系统

转载 作者:行者123 更新时间:2023-12-01 23:11:01 26 4
gpt4 key购买 nike

我第一次尝试使用 CQRS 和事件溯源,我有几点需要一些指导。我想实现一个 SO 风格的声誉系统。这似乎非常适合这种架构。

以 SO 为例。假设一个问题被投票,这会生成一个 UpvoteCommand,它会增加问题总分并触发一个 QuestionUpvotedEvent

似乎作者的用户聚合应该订阅 QuestionUpvotedEvent,这可能会增加信誉分数。但是我不清楚您如何/何时进行此订阅?在 Greg Youngs 示例中,事件/命令处理连接在 global.asax 中,但这似乎不涉及任何基于聚合 Id 的路由。

似乎每个用户聚合都会订阅每个看起来不正确的 QuestionUpvotedEvent,为了使这样的方案工作,事件处理程序必须表现出行为来识别该用户是否拥有刚刚被赞成的问题。 Greg Young 暗示这不应该出现在事件处理程序代码中,它应该只涉及状态更改。

我在这里做错了什么?

非常感谢任何指导。

编辑

我想我们在这里谈论的是问题和用户聚合之间的聚合间通信。我可以看到的一个解决方案是 QuestionUpvotedEventReputationEventHandler 订阅,然后可以获取相应的用户 AR 并在该对象上调用相应的方法,例如YourQuestionWasUpvoted。这将反过来生成用户特定的 UserQuestionUpvoted 事件,从而保留将来的重播能力。这个方向是否正确?

编辑 2

另见关于 google 群组的讨论 here .

最佳答案

我的理解是聚合本身不应该订阅事件。领域模型只引发事件。订阅事件的是查询端或其他基础架构组件(例如电子邮件组件)。

域服务旨在处理涉及多个聚合的用例/命令。

在这种情况下我会怎么做:

  • VoteUpQuestionCommand 被调用。
  • VoteUpQuestionCommand 调用的处理程序:

    IQuestionVotingService.VoteUpQuestion(Guid questionId, Guid UserId);

  • 然后这会影响问题和用户聚合,并在两者上调用适当的方法,例如 user.IncrementReputation(int amount) 和 question.VoteUp()。这将引发两个事件; UsersReputationIncreasedEventQuestionUpVotedEvent,由查询方处理。

关于cqrs - 带有 CQRS 和事件溯源的 SO 风格声誉系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7370143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com