Крім того, на додаток до всіх виставлених тут відповідей, обробник подій може також мати можливість запускати команду після отримання повідомлення про те, що сталася подія.
Скажімо, наприклад, що після створення Клієнта Ви також хочете ініціалізувати деякі значення облікових записів і т. Д. Після того, як АР Клієнта додає подію до EventDispatcher, і це отримує об'єкт CustomerCreatedEventHandler, цей обробник може викликати відправлення команди, яка виконає все, що вам потрібно, тощо.
Також існують DomainEvents та ApplicationEvents. Різниця просто концептуальна. Ви хочете спочатку відправити всі події вашого домену (деякі з них можуть спричинити події додатків). Що я маю на увазі під цим?
Ініціалізація облікового запису після того, як відбувся CustomerCreatedEvent - це подія DOMAIN. Надсилання сповіщення електронною поштою Клієнтові є Подією заявки.
Причина, по якій ви не повинні їх змішувати, зрозуміла. Якщо ваш SMTP-сервер тимчасово не працює, це не означає, що це має вплинути на вашу ДОМЕННУ РОБОТУ. Ви все ще хочете зберегти не пошкоджений стан своїх агрегатів.
Зазвичай я додаю події до свого диспетчера на рівні сукупного кореня. Ці події - або DomainEvents, або ApplicationEvents. Може бути і того, і іншого може бути багато. Після завершення мого обробника команд і повернення до стеку коду, який виконує обробник команд, я перевіряю свій диспетчер та відправляю будь-який інший DomainEvent. Якщо все це вдало, я закриваю транзакцію.
Якщо у мене є якісь Події додатків, саме час їх відправити. Надсилання електронного листа не обов'язково вимагає відкритого підключення до бази даних або відкритої області транзакцій.
Я трохи відійшов від початкового питання, але для вас також важливо зрозуміти, як події також можуть концептуально трактуватися по-різному.
Тоді у вас є Саги .... але це ВІДМОВО ВИМИКАТЬ сферу цього питання :)
Це має сенс?