Я розумію, що Команди нічого не повинні повертати.
Це один погляд, але він не повністю встановлений в камені. Поміркуйте над записом (PUT, POST, DELETE) на HTTP - всі ці повідомлення є командами, в тому сенсі, що це повідомлення з проханням змінити ресурс, і все ж вони повертають відповіді.
Отже, як ви впораєтеся з помилкою поза командною шиною? (Наприклад, користувач зареєструвався за 1 секунду раніше тим самим ім'ям користувача / електронною поштою).
Як ви знаєте, що команда не вдалася, і як ви знаєте помилку?
Так, у випадку, коли ви спілкуєтесь безпосередньо з обробником команд, повернене повідомлення - це цілком розумний спосіб визнати, що команда була отримана та оброблена.
Якщо ви використовуєте частину проміжного програмного забезпечення, наприклад шину, яка заважає вам спілкуватися безпосередньо з ціллю, то я б запропонував вам переглянути асинхронні шаблони обміну повідомленнями - як змусити обробника команд відправити повідомлення назад до абонент?
Одна ідея - підписатися на результат команди; це запозичує деякі ідеї в моделях інтеграції підприємств Hohpe. Основна ідея полягає в тому, що, оскільки клієнт знайомий з командним повідомленням, яке було надіслано, він добре підписався на будь-які нові повідомлення, опубліковані внаслідок командного повідомлення. Обробник команд після збереження даних у книзі записів публікує події, сповіщаючи про те, що зміна пройшла успішно, а клієнт підписується на ці події - визнаючи правильні події, розглядаючи збіг різних ідентифікаторів у повідомленні (ідентифікатор причин, кореляційний ідентифікатор тощо).
Альтернативні підходи трохи пряміші. Можна було б включити до повідомлення зворотний дзвінок, який може викликати обробник команд після успішної обробки повідомлення.
Дуже схожа альтернатива - резервування місця в командному повідомленні для обробника команд для написання підтвердження - оскільки клієнт вже має відповідне командне повідомлення, схема вже завершена. Подумайте " обіцянка " чи " повноцінне майбутнє". Повідомлення повідомляє обробнику команд, куди слід записати підтвердження; роблячи це сигналізує клієнту (зворотний відлік часу), що підтвердження доступне.
І звичайно, у вас є додатковий варіант видалити проміжне програмне забезпечення, яке, здається, перешкоджає зробити правильну справу просто.
Наприклад, користувач зареєструвався за 1 секунду раніше тим самим ім'ям користувача / електронною поштою
Якщо ви обробляєте реєстрацію користувача безвідмовно, це не обов'язково буде помилкою - повторення повідомлень, поки відповідь не спостерігається, є звичайним способом забезпечити принаймні один раз доставку.