CQRS:如何实现投票机制(多对多关系)

CQRS: How to implement a voting mechanism (many to many relationship)

我对 CQRS 和 DDD 比较陌生,想知道在域模型中实现投票机制的最佳方式是什么。

在产品上,用户可以 upvote/downvote。有一些关于投票的域规则,f.e。您只能投票一次,要么反对,要么反对。

投票和产品都是聚合根。这是最好的方法吗?建议保持较小的聚合。将投票添加到产品聚合根会超时使其变得臃肿。

我正在努力解决的问题是当投票是聚合根时删除投票。您需要知道需要删除哪些投票聚合。在命令处理程序中无法使用 productId 和 userId 从存储库中检索投票。 aggregateId 作为单个 Guid 存储在数据库中。

该命令将包含这些字段

我找到的一些可能的解决方案:

最好的方法是什么?

根据我对您领域的有限了解,我可以得出结论,有两个限界上下文 CatalogReviews。在这种情况下,您可以在 Catalog BC 中有一个 Product 聚合,在 Reviews BC 中有一个 Product 聚合。

来自 Reviews BCProduct 聚合将包含特定产品的所有 Vote 实体的列表。 Vote 实体将包含执行 vote only once 业务不变性所需的所有信息(如 IP 地址、用户 ID 等)。两种产品聚合类型(来自两个 BC)将共享相同的 ID - 如果需要,这就是使它们保持同步的方式(例如,当产品从目录中删除时,它在评论 BC 中被标记为不可投票)。