Nhibernate 复杂对象的存储库设计?

Nhibernate 复杂对象的存储库设计?,nhibernate,entity-framework,orm,repository,Nhibernate,Entity Framework,Orm,Repository,假设使用诸如NHibernate或实体框架之类的ORM,为复杂对象设计存储库的最佳方法是什么 我正在使用Entity Framework 4创建一个应用程序。该应用程序使用复杂对象--Foo对象包含Foo.Bar属性中的Bar对象集合,依此类推。在过去,我会创建一个FooRepository,然后创建一个BarRepository,然后我会将对BarRepository的引用注入FooRepository构造函数 当查询传递到Foo存储库时,它将根据需要调用BarRepository,为每个Fo

假设使用诸如NHibernate或实体框架之类的ORM,为复杂对象设计存储库的最佳方法是什么

我正在使用Entity Framework 4创建一个应用程序。该应用程序使用复杂对象--
Foo
对象包含
Foo.Bar
属性中的
Bar
对象集合,依此类推。在过去,我会创建一个
FooRepository
,然后创建一个
BarRepository
,然后我会将对
BarRepository
的引用注入
FooRepository
构造函数

当查询传递到
Foo存储库
时,它将根据需要调用
BarRepository
,为每个
Foo
对象构造
Foo.bar
属性。当
Foo
对象被传递到
FooRepository
进行持久化时,存储库将调用
BarRepository
来持久化
Foo.bar
属性中的对象


我的问题很简单:这是一种普遍接受的建立存储库的方法吗?有更好的方法吗?感谢您的帮助。

在域驱动设计中,有“根聚合”对象的概念。对于一个相关的问题,您可以很好地了解它是什么,以及您将如何在设计中使用它。我不知道实体框架,但NHibernate不需要您描述的使用模式。只要所有嵌套对象及其关系正确映射到表,保存聚合根也将保存其所有子对象。当嵌套对象有特定的业务逻辑需要作为其访问或持久性的一部分执行时,就会出现例外情况。在这种情况下,您需要传递“子”存储库,以便不复制该业务逻辑。

存储库模式有助于在相关实体之间对业务事务进行分组。这意味着,如果您有两个域对象foo和bar,并且有一个公共事务,如GetList()、Update(),则可以创建一个公共存储库,如foobarreportory。您甚至可以将其抽象为一个名为ifoobarreportory的接口,以使应用程序松散耦合