Обновления коллекций агрегированных корней - несовместимы с DDD. Действительные альтернативы? - PullRequest
0 голосов
/ 13 июля 2020

Я работаю над системой планирования встреч, изучая и внедряя дизайн, управляемый доменом. Я идентифицировал следующие агрегированные данные 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 объект с дочерняя сущность, имеющая набор дочерних сущностей), во всем прочитанном мною материале говорится, что агрегаты должны быть как можно меньше.

1 Ответ

1 голос
/ 13 июля 2020

За агрегатом root стоит концепция: Является ли ScheduleDay полностью независимым? Можете ли вы два ScheduleDays, которые равны, за исключением Schedule, к которому они относятся?

Кроме этого, решение с Schedule как IAggregate Root выглядит хорошо. Только убедитесь, что вы не загружаете все навигаторы. Если вы используете EntityFramework, вы можете использовать прокси LazyLoading.

...