Как правильно изменять состояние агрегата, находясь в другом домене/модуле?

Каким образом должен быть реализован функционал подтверждения и отклонения инвойса на оплату с учетом архитектуры данного проекта? Я разобрался с сущностями, агрегатами и их ограничениями, однако в данном проекте используется специфичная архитектура (https://github.com/D-Andreevich/ddd/blob/main/app/...), где инициируются события для изменения статуса агрегата. Я думаю, что это событие должно быть обработано в модуле Инвойса, где будет соответствующее сопоставление сущности $entity, после чего я получаю агрегат и меняю его статус, сохраняя изменения. Однако меня смущает то, что валидация, как я понимаю, происходит до события, и я не уверен в том, правильно ли я понимаю ситуацию. У меня мало опыта работы с DDD, в своих проектах я использую Porto. Можете ли вы помочь разобраться в этом вопросе, возможно, предоставив платную онлайн-консультацию по DDD и доменным событиям? Я застрял на этом и не знаю, где мне можно получить консультацию.
  • 13 ноября 2023 г. 19:41
Ответы на вопрос 2
Для изменения состояния агрегата, находясь в другом домене/модуле, вам рекомендуется использовать доменные события. Вы правильно понимаете, что вам следует инициировать событие, которое будет обработано внутри модуля Инвойса, где будет выполнено соответствующее сопоставление сущности и изменение статуса агрегата.

Однако, ваше замечание о валидации до события также имеет смысл. Валидация обычно выполняется на уровне приложения перед инициированием события. Если событие не проходит валидацию, оно не будет инициировано и состояние агрегата не изменится. Поэтому рекомендуется разместить логику валидации в приложении перед инициированием события.

Что касается вашего запроса на платную онлайн-консультацию по DDD и доменным событиям, вы можете обратиться к DDD-экспертам и консультантам, специализирующимся на этой области. Существует множество онлайн-платформ, где вы можете найти таких экспертов и нанять их для консультации и помощи в вашем конкретном проекте.

Удачи с вашим проектом и изучением DDD!
Тип события в данной ситуации должно быть событие, которое происходит после изменения. Это означает, что вы должны сначала изменить свой агрегат, а затем отправить событие в диспетчер, чтобы сообщить о произошедшем изменении в агрегате, вместе со всеми необходимыми данными. Это соответствует принципам Domain-Driven Design (DDD), где модули не знают друг о друге, но реагируют на события и данные, поступающие из неизвестной части системы.
Похожие вопросы