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

Domain driven design DDD-聚合根加载/查询性能,domain-driven-design,cqrs,ddd-repositories,aggregateroot,Domain Driven Design,Cqrs,Ddd Repositories,Aggregateroot,我在玩DDD,突然出现了这个问题。 如何加载子聚合根?会出现几个性能问题。想象一下下面的例子: public AggregateRoot1 { #region properties #endregion public AggregateRoot2 AR2{get;set;} public IEnumerable<AggregateRoot3> AR3List{get;set;} (...) } 公共聚合root

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

public AggregateRoot1
{
     #region
        properties
     #endregion

     public AggregateRoot2 AR2{get;set;}

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

     (...)
}
公共聚合root1
{
#区域
性质
#端区
公共聚合root2 AR2{get;set;}
公共数字
顺便说一句,我没有考虑使用延迟加载

我期待着听取您对child AR装载的意见。
感谢

理想情况下,聚合之间的引用应仅通过标识。这是选项1。但是,您应该评估每个引用,以查看是否需要它来保持引用持有聚合的一致性。有时,两个聚合之间的关系本身可以成为单独加载的聚合。总的来说,请看一看这也是David Masters在链接问题中指出的。

如果图太大,不能使用延迟加载,这可能是一个迹象,表明您的模型可能需要一些工作-您可能有一些实体,它们应该是自己的聚合e根

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


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

@eulerfx感谢您的回复。我同意引用另一个聚合根对象是wi这个ID,但是一个AR的集合呢。应该转换成一个AR的ID数组吗?我从来没有见过类似的实现,我看到的示例只是1-1的关系。此外,由于GUI不是通用语言的一部分,如果你真的需要它们来确保业务不变量,你应该使用。一个AR ID的集合我同意eulerfx的观点,并想补充一点,我不认为加载整个对象图是一个大问题,因为这是大多数DI容器所做的,除非这些对象从网络或硬盘加载大量数据。我同意你的观点,但问题的关键是引用子对象oot,或者您的聚合根从未引用过另一个聚合根?这一点在于加载子聚合根。