2011-05-01 105 views
4

与子集合工作考虑下面的简单类时避免完全在内存中的集合,让我们假设:NHibernate的:通过聚合根

  • 父能有一个比较大的量的儿童(如1000)
  • 子集合是懒加载
  • 我们已加载一个母公司通过它的ID从ParentRepository的标准Get方法,并且现在要读OldestChild财产
class Parent 
{ 
     public IList<Child> Children { get; set; } 

     public Child OldestChild 
     { 
     get { return Children.OrderByDescending(c => c.Age).FirstOrDefault(); 
     } 

} 

当使用NHibernate和库,有没有一些最佳实践方法,以同时满足:

  • 一)应通过聚合根选择最大的孩子(家长) - [即。而不需要通过例如独立查询儿童桌子。使用父ID]

  • b)应避免加载整个儿收集到内存(理想情况下,最大的孩子查询应该由DB处理)一个ChildRepository

这似乎东西应该既可能又简单,但我没有看到实现它的明显方式。可能我错过了什么?

我使用的是NHibernate 2.1,所以一个解决方案会很棒,虽然会很快升级到3。

回答

2

我会在你的仓库中创建一个专门的方法,它会返回给定父项的最老的子项。

+0

是的,这是我能想到的最好的,并可能从实用的角度来看。我担心的是,它违反了(DDD)'规则',你应该通过遍历父级(聚合根)对象的集合来访问子对象,而不是返回到存储库(参考问题中的点a) – UpTheCreek 2011-05-01 15:55:22

+0

我wouldn不考虑*直接访问*子对象是DDD反模式,但是我会考虑*更新*子对象直接成为否定。需要使用聚合根来执行不变量和其他业务规则。阅读和更新是非常不同的,这也是CQRS在DDD社区中很受欢迎的原因之一。 – 2011-05-01 16:25:43

+0

谢谢@迈克尔 - 深思。我很高兴这个共识似乎是直截了当的。我对CQRS概念没有经验,但我也会在某个时候看看这个。 – UpTheCreek 2011-05-01 16:48:08