Я начинаю разбираться в Domain Driven Design, и у меня возникают некоторые проблемы с репозиториями, и тот факт, что EF Core явно загружает, автоматически заполнит мои навигационные свойства.
У меня есть репозиторийчто я использую для загрузки моего совокупного корня и его потомков.Тем не менее, некоторые из совокупных дочерних элементов должны быть загружены позже (мне нужно загрузить эти объекты на основе диапазона дат).
Пример:
Загрузка владельцев расписаний
Рассчитать диапазон дат
Загрузить расписание владельца расписания
Я пытаюсь сохранитьмой уровень доступа к данным изолирован от основного уровня, и здесь у меня есть несколько вопросов.
Представьте себе этот метод в моем хранилище:
public List<Schedule> GetSchedules(Guid scheduleOwnePk, DateRange dateRange)
{
var schedules = dbContext.Schedules.Where(x => x.PkScheduleOwner == scheduleOwnerPk && x.StartDate >= dateRange.Start && x.EndDate <= dateRange.End).ToList();
return schedules;
}
Я могу вызвать этот метод из основного уровня вдвумя способами:
//Take advantage of EF core ability to fill the navigational property automatically
scheduleOwnerRepository.GetSchedules(scheduleOwner.Pk, dateRange)
или
var schedules = scheduleOwnerRepository.GetSchedules(scheduleOwner.Pk, dateRange);
//At this moment EF core already loaded the navigational property, so I need to clear it to avoid duplicated results
scheduleOwner.Schedules.Clear();
//Schedules is implemented as an IEnumerable to protect it from being changed outside the aggregator root
scheduleOwner.AddSchedules(schedules);
Проблема с первым подходом состоит в том, что он пропускает ядро EF в слой ядра, что означает, что свойство ScheduleOwner.Schedules
больше не будетзаполнен, если я отойду от ядра EF.
Второй подход абстрагирует ядро EF, но требует некоторых дополнительных шагов, чтобы заполнить ScheduleOwner.Schedules
.Так как ядро EF автоматически загрузит навигационное свойство после вызова метода репозитория, я вынужден очистить его перед добавлением результатов, в противном случае я буду вставлять дублированные результаты.
Как вы, ребята, справляетесь с этимтакая ситуация?Используете ли вы основные функции EF или используете более естественный подход вызова метода репозитория и используете его результаты для заполнения какого-либо свойства?
Спасибо за помощь.