【发布时间】:2017-07-24 08:52:16
【问题描述】:
我对 CQRS 和 DDD 比较陌生,我想知道在域模型中实现投票机制的最佳方式是什么。
在产品上,用户可以赞成/反对。有一些关于投票的域规则,f.e.您只能投票一次,无论是反对还是赞成。
投票和产品都是聚合根。这是最好的方法吗?建议保持聚合较小。将投票添加到产品聚合根会超时使其臃肿。
我正在努力解决的问题是当投票是聚合根时删除投票。您需要知道需要删除哪个投票聚合。命令处理程序无法使用 productId 和 userId 从存储库中检索投票。 aggregateId 作为单个 Guid 存储在数据库中。
该命令将包含这些字段
- 用户ID
- 产品编号
我发现的一些可能的解决方案:
- 使用基于 userId 和 productId 的确定性 GUID
- 投票是产品的汇总列表
- 创建一个 voteId 并使用它来删除投票。
- 将聚合存储为字符串并使用 productId 和 userId 的组合
最好的方法是什么?
【问题讨论】:
-
标记为已删除是什么意思?您需要一个补偿操作,一个具有相同 UserId 和 ProductId 的新命令。
-
会有一个具有相同 userId 和 productId 的新命令。然后,命令处理程序将获得投票并将其设置为已删除(已取消)。
-
您能否也从业务角度而非纯技术角度进行解释?什么时候可以删除投票?这是用户取消投票的结果吗?是否还有更多需要这样做的情况?
-
用户会看到两个按钮(upvote,downvote)。当用户按下 upvote 按钮时,他的投票就会被记录下来,并且该按钮会在 UI 上突出显示。当用户再次按下upvote按钮时,他的投票被取消。
标签: domain-driven-design cqrs event-sourcing