DDD - 聚合根加载/查询性能

时间:2013-03-13 12:58:42

标签: domain-driven-design cqrs ddd-repositories aggregateroot

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

public AggregateRoot1
{
     #region
        properties
     #endregion

     public AggregateRoot2 AR2{get;set;}

     public IEnumerable<AggregateRoot3> AR3List{get;set;}

     (...)
}

如果我在获得AggregateRoot1时加载了AggregateRoot2和AggregateRoot3列表,那么图表就会非常庞大​​。这似乎不是一个好方法。

我有两个选择:

  1. Guid AR2Id IEnumerable AggregateRoot3&gt;替换 AggregateRoot2 AR2 AR3List IEnumerable Guid&gt; AR3ListIds 即可。所有AR引用都应该由ID代替。
  2. 因为我不喜欢IEnumerable ARListIds方法,所以我想要删除0 ... *引用AR&#39; s。需要AR列表数据的所有操作都应通过像David Masters sugest这样的域服务来实现here
  3. 是的,我不考虑使用延迟加载。

    我期待听取您关于儿童AR装载的意见。 感谢

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

如果图形变得太大并且您无法使用延迟加载,则可能表明您的模型可能会使用某些工作 - 您可能拥有的实体应该是它们自己的聚合根。

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

遵循DDD的一个原因是复杂性的封装。但是拥有非root对象的ID会破坏这种封装。虽然可能存在性能因素,但过早优化性能代码通常不会创建出色的软件。