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