Мой ответ не охватывает подробный код реализации / код, поскольку кажется, что вы используете его в качестве упражнения для получения дополнительной информации о DDD.
Помните, что в большинстве случаев вы не сможете получитьмодель правильно с первого раза и нужно развивать модель.По мере того, как вы «играете с этим», некоторые жесткие части станут более гибкими для изменения.(Как садовая перчатка по аналогии с Эриком).По мере того, как вы получаете новое понимание предметной области, вы обнаружите, что вам необходимо внедрить новые концепции в вашу модель.Использование «простых примеров» сопряжено с опасностями, например, им может не хватать глубины.Но иногда нужны простые примеры, чтобы освоить DDD, и, к счастью, мы можем развить пример ;)
Одна вещь, о которой я слышал, Эрик Эванс упоминал, что если домен неВы чувствуете себя хорошо, или у вас есть проблемы с выражением чего-либо в модели, вы можете пропустить концепцию .Естественно, если у вас есть понятия в вашем домене, вы можете «почувствовать» или найти естественное место, где произойдет валидация.
Установив контекст, у меня, таким образом, будет предложение , как изложено ниже:
Enterprise Patterns и MDA имеет несколько сложных шаблонов, но идея, которую вы можете убрать, - это CapacityManager архетипа Inventory в качестве руководства.К сожалению, модель на стр. 278 недоступна в Интернете, но посмотрите на архетип ServiceInventory.
Преподаватели продают свои услуги студентам.(Инструкторы получают зарплату в прошлый раз, когда я проверял :).Если бы я сопоставил ваш пример с архетипом Inventory для идей, я бы использовал:
- Inventory - список инструментов / курсов
- ServiceType - сведения об инструментах / курсах, начало и конец и т. Д.
- ServiceInventoryEntry - Инструмент + доступные места (использует диспетчер емкости)
- ServiceInstance - Enrollment - место в классе (Запланировано, Забронировано, Отменено, Завершено)
- CapacityManager (используется ServiceInventoryEntry)
- ReservationRequest - Запрос на регистрацию
Я думаю, что ключевой концепцией является CapacityManager: Вы можете вызвать метод ServiceInventoryEntry :: getCourses (), который будет использовать методCapacaityManager (служба или класс), чтобы показать вам / рассчитать доступных учителей или вернуть по умолчанию.Таким образом, вызывайте его несколько раз в зависимости от контекста: по умолчанию или предложите список доступных мест / мест / инструкторов.
С помощью этой модели вы сможете найти естественное место (где и когда) для проверки.Руководство по Упорядоченному объектному моделированию состоит в том, чтобы поставить проверку там, где находятся данные.Не следует воспринимать это как жесткое правило, но у объектов есть естественная тенденция объединять правильные задачи и данные.Например, менеджер по мощности знает о регистрации и инструментах.(Из MDA - CapacityManger: управляет использованием емкости, выпуская ServiceInstances)
Чтобы ваши агрегаты видели, какие транзакции / изменения вы будете делать, чтобы вы могли убедиться, что они применяют инварианты (правила).В вашем примере я бы сделал ServiceType (Course) объектом-значением, а ServiceInventoryEntry и ReservationRequests агрегировали корни.(Зависит от того, насколько сложным вы хотите придерживаться своих правил).Вы также можете добавлять учеников и учителей в партии, как указано в книге MDA.Я склонен использовать репозитории, чтобы получить свои агрегаты, а затем также полагаюсь на инверсию управления, согласно книге Джимми, на которую вы ссылались.
Причина, по которой мне нравятся паттерны MDA, заключается в том, что они заставляют меня думать об использованиислучаи и модельные концепции, которые я или бизнес не могли бы себе представить .Но будьте осторожны, только моделируйте то, что вам нужно , так как шаблоны MDA могут быть большими и даже соблазнительными.Хорошо, что они спроектированы так, чтобы быть модульными или «масштабируемыми».
Короче говоря: - Ваши совокупные корни должны гарантировать, что ваш домен находится в допустимом состоянии (Правила / Инварианты).Лидирование, где данные. Ваша модель будет направлять вас.