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

Val*_*ann 4 domain-driven-design cqrs event-store

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

在产品上,用户可以upvote/downvote.关于投票有一些域规则,你只能投票一次,无论是向下还是向上投票.

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

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

该命令将包含这些字段

  • 用户身份
  • 产品编号

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

  • 使用基于userId和productId的确定性GUID
  • 投票是产品的聚合列表
  • 创建一个voteId并使用它来删除投票.
  • 将聚合存储为字符串,并使用productId和userId的组合

什么是最好的方法?

Con*_*enu 5

利用我对您的域名的有限理解,我可以得出结论,有两个有界的上下文CatalogReviews.在这种情况下,你可以有一个Product在总体上Catalog BC和一个Product在聚集Reviews BC.

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

  • @Valderann非常常见且DDD基本.共享ID桥接来自多个有界上下文的聚合,并允许将聚合分割成多个较小的聚合. (3认同)