复杂对象的存储库设计?

时间:2011-04-11 02:09:18

标签: nhibernate entity-framework orm repository

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

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

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

我的问题非常简单:这是一种普遍接受的设置存储库的方法吗?有更好的方法吗?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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