Добрый день. Немного начал разбираться с DDD, необходимо любое мнение по задаче, пока сам думаю.
Есть меню в ресторане: состоит из блюд и дополнений к нему. (например, блюдо - бургер, дополнения: лук, помидор и так далее). Дополнения могут быть обязательными (для суши обязательное дополнение - палочки) и необязательными (пример с бургером). Они могут быть вместе (например, 2 обязательных и 3 необязательных, но для блюда всего доступно на выбор 5 дополнений. У суши дополнения: палочки, сыр, огурец. Обязательные только палочки).
Правило: пользователь хочет добавить суши без палочек в корзину. Я должен дать ему ошибку, что отсутствует обязательное дополнение "палочки".
Что у меня сейчас получается:
У меня есть сущность Product и сущность Addition.
Сущность Product имеет несколько доступных ему Addition'ов. Они могут быть обязательными и необязательными.
Для корзины соответственно сущность Cart, CartProduct и CartAddition.
При добавлении блюда в корзину у меня получается тоже самое, только CartProduct с несколькими CartAddition'ами.
Проблема:
Я не могу положить блюдо в корзину без обязательных дополнений. Если сначала создать блюдо, а только потом добавить туда дополнения - будет момент, когда блюдо невалидно. Условно говоря в конструкторе CartProduct'а должны быть аргументы (Product и array<Addition>).
Но и в таком случае может быть ситуация, что обязательных дополнений 2, а мы добавили из них только одно. Снова инвариант.
Валидировать в конструкторе я не хочу, валидировать в другом объекте создателе CartProductBuilder'е выглядит небезопасно.
Где собственно эту ситуацию можно валидировать? Что можете посоветовать?