2

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

public AggregateRoot1
{
     #region
        properties
     #endregion

     public AggregateRoot2 AR2{get;set;}

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

     (...)
}

如果我在获得 AggregateRoot1 时加载 AggregateRoot2 和 AggregateRoot3 列表,则该图会很大。这似乎不是一个好方法。

我有两个选择:

  1. 将AggregateRoot2 AR2替换为Guid AR2IdIEnumerable AggregateRoot3> AR3List 替换IEnumerable Guid> AR3ListIds。所有 AR 引用都应替换为 ID。
  2. 因为我不喜欢 IEnumerable ARListIds 方法,所以我正在考虑删除 0...* 对 AR 的引用。所有需要 AR 列表数据的操作都应该通过像 David Masters 这样的域服务来完成

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

我期待听到您对儿童 AR 加载的意见。谢谢

4

2 回答 2

7

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

于 2013-03-13T15:55:31.590 回答
0

如果图表变得太大并且您不能使用延迟加载,这可能表明您的模型可以使用一些工作 - 您可能拥有应该正确地作为它们自己的聚合根的实体。

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

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

于 2013-03-13T21:51:39.047 回答