Вот пример реализации отложенной загрузки с использованием шаблона Proxy
Класс Person, который будет жить с остальными вашими моделями. Children помечается как виртуальный, поэтому его можно переопределить внутри класса PersonProxy.
public class Person {
public int Id;
public virtual IList<Child> Children { get; set; }
}
Класс PersonRepository, который будет жить с остальными вашими репозиториями. Я включил метод, чтобы получить детей в этом классе, но вы можете использовать его в классе ChildRepository, если хотите.
public class PersonRepository {
public Person FindById(int id) {
// Notice we are creating PersonProxy and not Person
Person person = new PersonProxy();
// Set person properties based on data from the database
return person;
}
public IList<Child> GetChildrenForPerson(int personId) {
// Return your list of children from the database
}
}
Класс PersonProxy, который живет с вашими репозиториями. Это наследуется от Person и будет выполнять ленивую загрузку. Вы также можете использовать логическое значение, чтобы проверить, было ли оно уже загружено, вместо того, чтобы проверить, есть ли Children == null.
public class PersonProxy : Person {
private PersonRepository _personRepository = new PersonRepository();
public override IList<Child> Children {
get {
if (base.Children == null)
base.Children = _personRepository.GetChildrenForPerson(this.Id);
return base.Children;
}
set { base.Children = value; }
}
}
Вы можете использовать это так
Person person = new PersonRepository().FindById(1);
Console.WriteLine(person.Children.Count);
Конечно, вы можете использовать PersonProxy в интерфейсе к PersonRepository и получать к нему доступ через службу, если не хотите вызывать PersonRepository напрямую.