【问题标题】:IRepository Aggregates and Lazy LoadingIRepository 聚合和延迟加载
【发布时间】:2011-11-19 04:32:29
【问题描述】:

我整天都在搜索 stackoverflow 和互联网上关于 IRepository 模式的信息,试图在我愤怒地尝试使用它之前更好地理解它。

根据我的阅读(如果我弄错了,请纠正我),repository 封装了对其聚合根和子对象的访问,公开了一个公共接口,然后可以注入或模拟。

因此,在您拥有聚合根对象的情况下:

class Employee {
    string FirstName;
    string LastName;
    IEnumerable<Address> Addresses;
    IEnumerable<PhoneNumber> PhoneNumbers;
}

然后是它的子对象:

class Address {
    string BuildingName;
    ...etc
}

class PhoneNumber {
    string PhoneNo;
    ...etc
}

所以存储库看起来像:

class EmployeeRepository : IRepository<Employee> {
    Employee Get(id) {
    ...does stuff, builds full Employee object including Addresses/Phone No's and returns
    }
}

但是说我不想获取整个 Employee,说我只想要带有 FirstName LastName 的平面 Employee 记录,并且能够在以后延迟加载其余部分。这应该如何实现?是否允许有类似的东西:

class EmployeeRepository : IRepository<Employee> {
    Employee Get(id) {
    ...does stuff and builds flat Employee object without Addresses and Phone Numbers
    }

    Employee GetAddresses (Employee emp) {
    ...
    }

    Employee GetPhoneNumbers (Employee emp) {
    ...
    }
}

这样可以吗,还是我会违反一些神圣不可侵犯的 DDD 规则并在开发人员的地狱中燃烧?延迟加载应该如何适合这个模型,再次尝试搜索,但我发现的只是“让 NHibernate/Entity Framework/ORM 为你做”。

提前致谢。

D.

【问题讨论】:

    标签: c# lazy-loading repository-pattern


    【解决方案1】:

    真正的延迟加载意味着您​​在聚合根的属性中引用了代理对象(以及您最终延迟加载的对象图中的任何其他位置),这些引用足够聪明,可以加载真实实体并替换代理当调用需要它的属性时使用它。使用 Castle 的动态代理或 linfu 的动态代理之类的东西是最好的方法,因为动态代理是那些已经很好地实现的复杂野兽。

    按照您的建议执行操作要求您的使用代码了解已加载和未加载的内容,并使用户有责任了解延迟加载并在客户端代码中考虑它。使用动态代理,您不必考虑它。

    确实,最好的答案是您已经找到的答案。这是 ORM 已经解决的问题。使用 NHibernate 并担心您的领域,而不是实施已经实施并经过良好测试并被大量其他项目使用的东西。这是一个有很多细微差别的问题,你最好使用已经存在的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2018-06-24
      相关资源
      最近更新 更多