Я весь день тралял стекопоток и Интернет в целом по поводу паттерна 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.