Я работаю над системой планирования встреч, изучая и внедряя дизайн, управляемый доменом. Я идентифицировал следующие агрегированные данные Root - ScheduleDay .
public class ScheduleDay : Entity, IAggregateRoot
{
// Value Object - Full datetime and year, month, week, day values as integers
public Day Day { get; }
// Value Object - schedule for the day
public Schedule Schedule { get; }
// Other properties
private readonly List<Appointment> _appointments;
// Value Object - Appointments for the day
public IReadOnlyCollection<Appointment> Appointments => _appointments;
// Functions for adding/managing appointments and schedule day
}
ScheduleDay представляет собой один календарный день и содержит необходимую информацию и бизнес-логи c для создания встреч и управления ими.
Проблема - Что делать, если я хочу обновить все Пятницы с другим расписанием?
Насколько я знаю и вы прочитали, Domain Driven Design утверждает, что вы можете работать только с одним агрегатом одновременно . Это означает (если я не ошибаюсь) вы не можете загружать набор агрегатов и обновлять их одновременно. Даже если бы вы могли - загрузка коллекции Schedule Day Aggregates потенциально также загрузила бы тысячи встреч, что сильно повлияло бы на производительность, не говоря уже о блокировке БД.
Возможное решение (1)
Создайте собственное расписание. Для каждого дня недели (например, пятницы) будет свой агрегат Root. Затем я мог бы сохранить идентификатор расписания в агрегате ScheduleDay.
public class Schedule : Entity, IAggregateRoot { }
public class ScheduleDay : Entity, IAggregateRoot
{
public Guid Schedule { get; }
}
Когда мне нужно обновить расписание на пятницу, я буду обновлять только 1 запись в БД. Проблема (?) В том, что если я хочу назначить новую встречу, я должен сначала загрузить расписание из БД, затем мне нужно загрузить расписание дня - два SQL звонков.
Возможный решение (2)
Сделать расписание Root Агрегировать и запланировать день для объекта.
public class Schedule : Entity, IAggregateRoot
{
public ScheduleDay ScheduleDay { get; }
}
public class ScheduleDay : Entity { }
С этим я беспокоюсь о том, чтобы сделать агрегат слишком большим (root объект с дочерняя сущность, имеющая набор дочерних сущностей), во всем прочитанном мною материале говорится, что агрегаты должны быть как можно меньше.