2011-11-18 2 views
0

나는 분노로 사용하려고하기 전에 더 많이 이해하려고하는 IRepository 패턴에 대해 일반적으로 stackoverflow와 인터넷을 하루 종일 추적하고 있습니다.IRepository 집계 및 지연로드

repoistory는 주입 및 조롱이 가능한 공통 인터페이스를 노출하는 총 루트 및 자식 객체에 대한 액세스를 캡슐화합니다.

그래서 당신은 당신의 집계 루트 객체가 인스턴스의 :

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

자식 객체 :

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

:

class Address { 
    string BuildingName; 
    ...etc 
} 

class PhoneNumber { 
    string PhoneNo; 
    ...etc 
} 

그래서 저장소가 같이 보일 것을 하지만 전체 직원을 얻고 싶지는 않다고 말하면서, 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/Entity Framework/ORM이 당신을 위해 해줄 것"입니다.

미리 감사드립니다.

D.

로드 똑똑 것

답변

2

사실 게으른 로딩이 당신이 당신의 집계 루트의 특성에 프록시 객체에 대한 참조를 (그리고 다른 곳에서는 객체 그래프에서 당신이 느리게로드를 바람) 것을 의미 실제 엔티티를 만들고이를 필요로하는 속성이 호출 될 때 프록시를 프록시로 교체하십시오. 캐슬의 동적 프록시 또는 linfu의 동적 프록시와 같은 것을 사용하는 것이 동적 프록시가 그 사람들에 의해 잘 구현 된 복잡한 짐승이기 때문에 이것을 수행하는 가장 좋은 방법입니다.

당신이 제안한 것은 당신의 소비 코드가 무엇을 가지고 있고 아직로드되지 않았는지를 알아야하고, 사용자가 게으른 로딩에 대해 알고 클라이언트 코드에서 그것에 대해 생각할 것을 요구합니다. 동적 프록시를 사용하면 생각할 필요가 없습니다.

정말로 가장 좋은 대답은 이미 발견 한 답변입니다. 이것은 ORM에 의해 해결 된 문제입니다. NHibernate를 사용하고 이미 구현되어 있고 다른 프로젝트에 의해 잘 테스트되고 사용되는 것을 구현하는 것이 아니라 도메인에 대해 걱정하십시오. 그것은 많은 뉘앙스가있는 문제이며, 이미 나와있는 것을 사용하는 것이 더 낫습니다.