Что касается меня, то основная идея DDD - это повсеместный язык, ограниченный контекст и сопоставление контекста.Итак, если мы сосредоточимся на этих концепциях, все остальные части станут деталями реализации.
15 лет назад, когда была написана «Синяя книга», пришло время Java.В настоящее время существуют разные парадигмы, которые приходят и уходят.
Мне нравится разделять команды, запросы, события и ответы на разные уровни.Основная проблема в том, что вам скоро не хватит подходящих слов.Но это хорошо известная проблема с программированием.
В основе реализации лежит словарь.Это не весь вездесущий язык, но, вероятно, большая его часть.Там я моделирую доменные классы и структуры, в основном используя неизменяемые типы данных.Там вы положили фабрики и инварианты.Словарь не зависит от других частей кода.
Далее, у бизнес-ядра есть лица, принимающие решения, которые принимают команды и создают события или отклоняют.Команда - это намерение изменить состояние системы.Событие - это принятое решение об изменении состояния систем.Оба неизменны и выражены с использованием словарного запаса.Команда содержит исчерпывающие данные, необходимые для принятия решения, поэтому лицу, принимающему решение, не нужно извлекать дополнительные данные откуда-либо.Таким образом, лицо, принимающее решение, может быть чистой функцией.
Команды и события являются внутренними для бизнес-ядра системы.Но вы получаете запросы и отправляете ответы в неком проводном формате, таком как JSON, XML, ProtoBuf и так далее.Вы должны маршалировать / демаршировать его, добавлять дополнительные данные, такие как аутентификация / идентификация, различные идентификаторы трассировки, и преобразовывать их в некоторую объектную модель, которая ничего не знает о форматах проводов.Я называю эти объектные модели бизнес-запросом и бизнес-ответом.Они принадлежат прикладному уровню.
Одного запроса и ответа недостаточно.Помимо их данных вам необходимо получить дополнительные данные из репозиториев и других зависимостей и сохранить их после принятия решения об изменении состояния.Поэтому получение бизнес-запроса, сбор данных из зависимостей, создание команды, отправка ее лицу, принимающему решение, возвращение события или отклонения, выполнение этого решения (хранение в репозитории и т. П.) И создание бизнес-ответа - все это обязанностиприкладного уровня.
Я не описываю модели чтения, потому что они могут быть реализованы многими различными способами, если ответы от моделей чтения попадают на прикладной уровень, выраженный типами данных из словаря.
Таким образом, проводные форматы и преобразователи в / из бизнес-запроса / ответа относятся к уровню адаптеров инфраструктуры.Бизнес-запросы и ответы и их преобразователи в / из команды / события / отклонения принадлежат прикладному уровню (а также задаче по подготовке данных для принятия решений и выполнения принятых решений).А команды / события / отклонения принадлежат функциональному ядру.
Такие термины, как запрос, ответ, команда, событие не очень полезны: они довольно перегружены, и это своего рода ирония, что мы используем их на земленечеткого вездесущего языка.Но все же я надеюсь, что это поможет.