Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

DDD Итоговая согласованность между агрегатами

Ситуация: есть следующие агрегаты:
Машина Двигатель Колеса Кузов Модель машины Модель двигателя Модель колес Модель кузова
Каждый агрегат имеет собственный идентификатор. Внутри машины расположены идентификаторы двигателя, колес и кузова. В каждом агрегате техники располагается идентификатор соответствующей модели.
Есть правило: при установке в машину двигателя, колес и кузова их модели должны быть совместимы с моделью машины. Т. е. некоторые параметры моделей дочернего оборудования должны совпадать с соответствующими параметрами модели машины.
Допустим в машине уже установлен двигатель. Я решил поменять модель двигателя. Агрегат Двигатель изменился и был сохранен в базу данных. Но модель двигателя должна быть совместима с моделью машины. Получается должна быть итоговая согласованность (Eventual Consistency) между агрегатами Машина и Двигатель.
Вопрос: Как грамотно реализовать разрешение конфликта несоответствия новой модели двигателя и моделью машины, на которую двигатель уже был установлен?
P.S. Проще всего подобные проверки проводить заранее в прикладной службе до изменения модели агрегата. Однако в прикладных службах не должно быть логики доменной модели.


Ответ

В условиях известного предметного окружения я бы пошел по самому простому пути. Двигатель знает о том, что он может использоваться в машине и при собственной попытке сохранения пересохраняет (перевалидирует) машину.
В теории, надо делать какой то сервис событий, на который подписываются все заинтересованные, но тут смотрите сами, реализация будет не очень проста и довольно неочевидна, особенно в случае циклических событий, которые друг друга начнут генерировать.

Комментариев нет:

Отправить комментарий