<分区>
首先,我承认我是 DDD 的新手,需要阅读“blue book”。
我正在构建一个具有“Match”类型的 AggregateRoot 的系统。每个比赛都可以有一个“投票”集合,还有一个只读的“VoteCount”属性,当用户对比赛投赞成票或反对票时,该属性会增加。
由于许多用户可能同时对一场比赛进行投票,因此必须从比赛中添加/删除投票,并且 VoteCount 必须作为一个涉及写锁的原子操作递增/递减(锁由 DB 处理) ). (我需要将 VoteCount 作为数据库中的静态值,以便其他进程/组件对其进行高效查询。)
在我看来,如果我坚持严格的 DDD,我会这样编写这个操作:
一个应用程序服务会收到一个投票请求对象 然后该服务将从 Match Repository 中检索 Match 对象 然后,该服务将调用 Match 对象上的某种方法,以将投票添加到集合中并更新 VoteCount。 然后,存储库会将 Match 实例持久保存回数据库 但是,由于 2 个主要原因,这种方法对我的应用程序不可行,如我所见:
我在后端使用 MongoDB,无法将此读写操作包装到事务中以防止对匹配数据及其关联的投票和投票计数进行脏读。
这是非常低效的。我拉回整个对象图只是为了添加一个投票并增加 VoteCount。虽然这在文档数据库中比在关系数据库中更有效,但我仍在执行不必要的读取操作。
问题 1 和 2 在将单个 Vote 对象发送到存储库并对 Mongo 执行一个原子更新语句时不是问题。
在这种情况下,投票是否可以被视为“聚合”并且应该拥有自己的存储库和聚合状态?