Я новичок в DDD. Я понятия не имею, кто отвечает за процесс с запросом API.
Бизнес-логика принадлежит модели предметной области, оркестровка принадлежит приложению.
Таким образом, логика в вашем приложении обычно будет выглядеть примерно так ...
Order order = orderRepository.get(orderId);
order.cancel();
Модель Порядка отвечает за знание того, как манипулировать собственной структурой данных в памяти, когда вызывается Order::cancel
. OrderRepository отвечает за постоянство. Приложение запускает вызов двух других элементов.
Часть путаницы заключается в том, что понятие «сервис» перегружено. В DDD «служба домена» относится к шаблону, являющемуся частью модели домена (точно так же, как объекты значений и сущности являются шаблонами модели домена).
Обновление 20190120
Но кто обновляет базу данных на сервере? Ваш код кажется, что база данных на сервере еще не была обновлена, если order.cancel () обновляет только собственную память. Это мое мышление.
Это действительно важный вопрос, не так ли? :)
Когда Эрик Эванс впервые описал шаблон репозитория в своей книге, он сознательно выбрал шаблон репозитория с семантикой сбора и предложил, чтобы управление транзакциями было приложением .
В псевдокоде:
beginTransaction();
Order order = orderRepository.get(orderId);
order.cancel();
commitTransaction();
Суть в том, что базовый mapper может просмотреть хранилище и определить, какие объекты являются "грязными", и, таким образом, сгенерировать соответствующие вызовы для вашего постоянного хранилища.
В последнее время вы с большей вероятностью увидите репозитории с хранилищем , а не с семантикой
beginTransaction();
Order order = orderRepository.get(orderId);
order.cancel();
orderRepository.save(order);
commitTransaction();
Основная механика та же самая, но мы устранили некоторые из магии того, как изменения делятся.