DDD—聚合根负载/查询性能



我正在玩DDD,这个问题弹出。如何加载子聚合根?会出现几个性能问题。想象一下下面的例子:

public AggregateRoot1
{
     #region
        properties
     #endregion
     public AggregateRoot2 AR2{get;set;}
     public IEnumerable<AggregateRoot3> AR3List{get;set;}
     (...)
}

如果我加载AggregateRoot2和AggregateRoot3列表时,我得到AggregateRoot1,图形将我巨大。这似乎不是一个好方法。

我有两个选择:

  1. Guid AR2Id代替AggregateRoot2 AR2,用IEnumerable Guid> ar3listds 代替IEnumerable AggregateRoot3> AR3List。所有AR引用都应该由ID替换。
  2. 因为我不喜欢IEnumerable ARListIds方法,我正在考虑删除0…*参考AR。需要AR列表数据的所有操作都应该通过David Masters在这里建议的域服务进行

顺便说一句,我不考虑使用延迟加载。

我期待听到你对儿童AR加载的意见。由于

理想情况下,聚合之间的引用应该仅根据标识进行引用。这是选项1。但是,您应该评估每个引用,以确定是否需要它来保持引用持有聚合的一致性。有时,两个聚合之间的关系本身可以成为单独加载的聚合。总之,看看Vaughn Vernon的《Effective Aggregate Design》,深入分析设计聚合体时的各种权衡。这也是David Masters在链接问题中所指出的。

如果图变得太大,而你不能使用延迟加载,这可能是一个信号,你的模型可能需要一些工作-你可能有实体,它们应该是自己的聚合根。

通过使用工厂和存储库,可以更好地管理大型对象。您可以缓存大型对象,或者在AggregateRoot1的工厂中实现单例模式。

遵循DDD的一个原因是对复杂性的封装。但是拥有非根对象的id会破坏这种封装。虽然可能存在性能方面的考虑,但过早地为性能优化代码通常不会创建好的软件。

最新更新