Мне интересно, как правильно обрабатывать проблему с нетерпением загрузки для сложных графов объектов при использовании шаблона репозитория. Я не думаю, что это не проблема с ORM.
Первая попытка:
public interface IProductRepository : IRepository<Product>
{
Product GetById(int id);
IProductRepository WithCustomers();
}
Это будет работать нормально, но это потребует повторения себя все время (написание пользовательских методов "С" во всех реализациях репозитория).
Следующий подход:
public interface IRepository<T> where T : IAggregateRoot
{
...
void With(Expression<Func<T, object>> propToExpand);
}
With
метод добавит элемент в частную коллекцию, который будет использоваться позже, чтобы узнать, какие реквизиты должны быть загружены при получении необходимых сущностей.
Этот вид работает и в порядке. Но я не люблю использовать:
productRepository.With(x=>x.Customer);
productRepository.With(x=>x.Price);
productRepository.With(x=>x.Manufacturer);
var product = productRepository.GetById(id);
В принципе - проблема в том, что нет цепочки. Я хотел бы, чтобы это было так:
var product = productRepository
.With(x=>x.Customer)
.With(x=>x.Price)
.With(x=>x.Manufacturer)
.GetById(id);
Я не мог этого достичь. Даже если бы я мог - я не уверен, будет ли это решение элегантным.
Это приводит к мысли, что я пропускаю что-то фундаментальное (отсутствие примеров где-либо). Существуют ли разные способы решения этой проблемы? Каковы наилучшие методы?