Использование шаблона репозитория не означает, что вы не сможете использовать отложенную загрузку.Вы все еще можете вернуть сущность, которая сможет лениво загружать связанные сущности.Единственное требование состоит в том, что DbContext
используемый для загрузки объекта должен быть "живым".
Но давайте посмотрим на определение хранилища по Мартин Фаулер :
Репозиторий является посредником между доменом и слоями отображения данных, действуя какколлекция объектов домена памяти.Объекты клиента создают декларативные спецификации запросов и отправляют их в хранилище для удовлетворения.Объекты могут добавляться и удаляться из репозитория, как и из простой коллекции объектов, и код отображения, инкапсулированный репозиторием, будет выполнять соответствующие операции за кулисами.Концептуально репозиторий инкапсулирует набор объектов, сохраняемых в хранилище данных, и операции, выполняемые над ними, обеспечивая более объектно-ориентированное представление уровня персистентности.Хранилище также поддерживает цель достижения четкого разделения и односторонней зависимости между доменом и слоями отображения данных.
Я думаю, что интересная часть состоит в следующем: Клиентские объекты создают спецификации запросов декларативно и отправляютих в хранилище для удовлетворения .Также хранилище обычно используется для обеспечения совокупных корней.Таким образом, вы либо всегда будете предоставлять весь корень (не всегда возможно), либо вы будете удовлетворять упомянутому утверждению, и вы определите нетерпеливую загрузку вне хранилища с помощью Include
метода расширения для IQueryable
.Поэтому вам никогда не понадобятся специализированные методы, такие как GetUserByIdIncludeSomething
.
Если вы хотите, чтобы пользовательское хранилище начиналось с этого метода для всех запросов:
public interface IRepository<T>
{
IQueryable<T> GetQuery();
}
Кстати.Я не думаю, что пользователь является совокупным корнем для сообщений.В этом случае большинство приложений будет иметь только один сводный корень - пользователь.
Редактировать:
Небольшое уточнение: IQueryable
по умолчанию не обеспечивает Include
метод.Он предоставляется как метод расширения в сборке CTP5, но если вы используете его, вы сделаете свой верхний уровень зависимым от EntityFramework.dll.Это то, что вы обычно не хотите (причина, по которой вы используете хранилище).Таким образом, вам нужно определить собственный метод расширения, добавив расширение в сборку с вашим хранилищем.