IRepository Aggregates и Lazy Loading - PullRequest
       15

IRepository Aggregates и Lazy Loading

0 голосов
/ 19 ноября 2011

Я весь день тралял стекопоток и Интернет в целом по поводу паттерна IRepository, пытающегося лучше понять его, прежде чем я попытаюсь использовать его в гневе.

Из того, что я прочитал (и, пожалуйста, исправьте меня, если я ошибаюсь), хранилище инкапсулирует доступ к своим совокупным корневым и дочерним объектам, открывая общий интерфейс, который затем можно внедрить или смоделировать.

Так что в случае, когда у вас есть ваш совокупный корневой объект:

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, скажем, я просто хочу фиксированную запись Employee с 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.

1 Ответ

2 голосов
/ 19 ноября 2011

Истинная отложенная загрузка будет означать, что у вас есть ссылки на прокси-объекты в свойствах вашего корневого агрегата (и где-либо еще в графе объектов, который вы загружаете лениво), который был бы достаточно умен, чтобы загрузить реальную сущность и заменить проксис ним, когда вызываются свойства, которые этого требуют.использование чего-то вроде динамического прокси замка или динамического прокси linfu - лучший способ сделать это, потому что динамические прокси - это сложные звери, которые были хорошо реализованы этими парнями.

выполнение того, что вы предложили, требует, чтобы ваш потребляющий код был осведомленто, что загружено и не загружено, накладывает на пользователя бремя знать о ленивой загрузке и думать об этом в клиентском коде.с динамическим прокси вам не нужно об этом думать.

действительно, лучший ответ, однако, тот, который вы уже нашли.это проблема, которая была решена ORM.использовать NHibernate и беспокоиться о своем домене, а не реализовывать то, что уже реализовано и хорошо протестировано и используется многими другими проектами.это проблема с большим количеством нюансов, и вам лучше использовать то, что уже есть.

...