2011-11-18 34 views
0

我一直在拖网stackoverflow和整个互联网一整天关于IRepository模式试图更好地理解它,然后我尝试和愤怒地使用它。IRepository聚合和延迟加载

从我读过的内容(如果我错了,请纠正我)repoistory封装对其聚合根和子对象的访问,暴露一个公共接口,然后可以注入或模拟。

所以,在你有你的聚合根对象的实例:

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 
    } 
} 

但是,说我不想让整个员工,说我只想与FirstName平的员工记录LastName并且能够在稍后延迟加载。这应该如何完成?难道是允许有这样的:

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 /实体框架/ ORM为你做”。

在此先感谢。

D.

回答

2

真正延迟加载就意味着你必须在你的聚合根的属性,代理对象的引用(和其他地方的对象图你懒懒地拉闸负荷),这将是足够聪明的加载真正的实体,并在调用需要它的属性时用它替换代理。使用类似castle的动态代理或linfu的动态代理是最好的方法,因为动态代理是这些家伙很好实施的复杂的动物。

根据您的建议,要求您的使用代码知道什么已经加载并且尚未加载,并让用户了解延迟加载的负担并在客户端代码中考虑它。使用动态代理,您不必考虑它。

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