【问题标题】:Repository design for complex objects?复杂对象的存储库设计?
【发布时间】:2011-04-11 02:09:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: nhibernate entity-framework orm repository


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-27
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多