加载所有实体作为聚合根的一部分

问题描述

从我在线阅读的内容来看,从数​​据库加载时,聚合必须处于完整状态。这意味着它必须有权访问从数据库中加载的所有内部实体,以使聚合永远不会处于无效/不完整状态。

如果集合包含一个实体,例如,可能有数百万个实体,该怎么办? Aggregate A包含Entity BEntity C。现在,最坏的情况是,Entity B下最多可以有100个Aggregate A实例,但是Entity C下可以有数百万(如果不是十亿)的Aggregate A


用例:

用例是我想使用一个ID从Entity C删除Aggregate A一个特定实例。为此,我必须首先从数据库中加载DDD,并将其所有实体都加载到内存中。然后使用以下方法删除该项目:

Aggregate A

问题:

将数百万个实体加载到内存中以针对单个请求执行任何public class AggregateA extends AbstractAggregateRoot<AggregateA>{ private String aggregateId; private Map<String,EntityC> entityC; public void removeEntityC(String idToRemove) { this.entityC.remove(idToRemove); registerEvent(new EntityCRemoved(aggregateId,idToRemove)); } } 似乎不是正确的方法

在这里想念东西吗?

解决方法

我认为这将是重新考虑您的总体界限的第一个迹象。一种可能的解决方案是将实体C视为集合,并通过id引用集合A。这取决于您的业务领域,因此这只是一个模糊的建议。您可以在集合A或单独的域服务中使用工厂方法来生成集合C的实例。通常,应避免在集合中加载数百个实体,因为它将跨越该集合的巨大事务边界。 >

/home/joncrall/tmp/rsync-test/local/rsync_test/root/inside_dir
,

您误解了DDD的“加载完整汇总”任务。如您所说,这样做是完全不切实际的。我的建议是加载所需聚合的完整部分。

例如:我的行动(虽然有人为做)是在具有数百万条评论的博客条目中编辑特定的博客评论。我要做的是加载博客聚合和我要从存储库更新的单个评论。然后,我将继续让博客聚合更新评论。当然,另一种设计选择是仅加载注释(因为您可以使用其ID标识它),但这将加载不完整的实体,因为它将丢失聚合根(这是任务规定要执行的操作) )。

当然,这里的一个问题是,在DDD中进行批量更新变得效率低下。这是设计上的弱点,是DDD之外解决的问题。