我正在玩DDD并弹出这个问题。 我如何加载子聚合根?会出现几个性能问题。想象一下以下示例:
public AggregateRoot1
{
#region
properties
#endregion
public AggregateRoot2 AR2{get;set;}
public IEnumerable<AggregateRoot3> AR3List{get;set;}
(...)
}
如果我在获得AggregateRoot1时加载了AggregateRoot2和AggregateRoot3列表,那么图表就会非常庞大。这似乎不是一个好方法。
我有两个选择:
我期待听取您关于儿童AR装载的意见。 感谢
答案 0 :(得分:7)
理想情况下,聚合之间的引用应仅基于标识。这是选项1.但是,您应该评估每个引用以查看引用保持聚合的一致性是否需要它。有时,两个聚合之间的关系本身可以成为一个单独加载的聚合。总的来说,在设计聚合时,请查看Effective Aggregate Design by Vaughn Vernon深入分析各种权衡。这也是David Masters在链接问题中指出的内容。
答案 1 :(得分:0)
如果图形变得太大并且您无法使用延迟加载,则可能表明您的模型可能会使用某些工作 - 您可能拥有的实体应该是它们自己的聚合根。
通过使用工厂和存储库,可以更好地管理大型对象。您可以在AggregateRoot1的工厂中缓存大对象或实现单例模式。
遵循DDD的一个原因是复杂性的封装。但是拥有非root对象的ID会破坏这种封装。虽然可能存在性能因素,但过早优化性能代码通常不会创建出色的软件。