c# - DDD - 聚合根 - 处理效率和并发

标签 c# mongodb domain-driven-design aggregateroot

<分区>

首先,我承认我是 DDD 的新手,需要阅读“blue book”。

我正在构建一个具有“Match”类型的 AggregateRoot 的系统。每个比赛都可以有一个“投票”集合,还有一个只读的“VoteCount”属性,当用户对比赛投赞成票或反对票时,该属性会增加。

由于许多用户可能同时对一场比赛进行投票,因此必须从比赛中添加/删除投票,并且 VoteCount 必须作为一个涉及写锁的原子操作递增/递减(锁由 DB 处理) ). (我需要将 VoteCount 作为数据库中的静态值,以便其他进程/组件对其进行高效查询。)

在我看来,如果我坚持严格的 DDD,我会这样编写这个操作:

一个应用程序服务会收到一个投票请求对象 然后该服务将从 Match Repository 中检索 Match 对象 然后,该服务将调用 Match 对象上的某种方法,以将投票添加到集合中并更新 VoteCount。 然后,存储库会将 Match 实例持久保存回数据库 但是,由于 2 个主要原因,这种方法对我的应用程序不可行,如我所见:

我在后端使用 MongoDB,无法将此读写操作包装到事务中以防止对匹配数据及其关联的投票和投票计数进行脏读。

这是非常低效的。我拉回整个对象图只是为了添加一个投票并增加 VoteCount。虽然这在文档数据库中比在关系数据库中更有效,但我仍在执行不必要的读取操作。

问题 1 和 2 在将单个 Vote 对象发送到存储库并对 Mongo 执行一个原子更新语句时不是问题。

在这种情况下,投票是否可以被视为“聚合”并且应该拥有自己的存储库和聚合状态?

最佳答案

Could Vote, in this case be considered an "aggregate" and be deserving of its own repository and aggregate status?

我认为这可能是正确的答案。聚合应该是事务一致性边界。一场比赛的投票之间是否有一致性要求? Match 聚合上的 Vote 集合的呈现表明存在。但是,似乎一票与下一票无关。

相反,我会单独存储每张选票。通过这种方式,您可以使用 MongoDB 的聚合功能来获取计数,但我不确定它是否仍然很慢。如果是,那么您可以使用 Map/Reduce 功能进行聚合。

更一般地说,这可能不是 DDD 的最佳选择。如果领域不包含复杂行为,则几乎没有理由尝试使 DDD 战术模式(实体、聚合)适应该领域。

关于c# - DDD - 聚合根 - 处理效率和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14637587/

相关文章:

php - 处理贫血领域模型

c# - 来自多个领域的 Sitecore Glass Mapper 属性

c# - 将 JSON 绑定(bind)到模型时使 WebAPI 拒绝未知字段

mongodb - 在Go中使用mgo找出插入对象的结果

MongoDB 与 Redis 与 Cassandra 的快速写入临时行存储解决方案

c# - 哪个类应该负责为实体创建 ID?

c# - 格式化数字作为排名位置

c# - 在 Dispatcher.RunAsync() 中使用 "await"会引发异常

node.js - 如何在 Mongoose 中的其他字段上创建可选字段?

c# - 领域驱动开发和丰富的 GUI