Візьмемо простий приклад "Реєстрація рахунку", ось такий потік:
- Відвідайте веб-сайт користувача
- Натисніть кнопку "Зареєструватися" та заповніть форму, натисніть кнопку "Зберегти"
- Контролер MVC: Перевірте унікальність UserName, прочитавши з ReadModel
- ЗареєструватиКоманда: Перевірити унікальність UserName ще раз (ось питання)
Звичайно, ми можемо перевірити унікальність UserName, прочитавши з ReadModel в контролері MVC, щоб покращити продуктивність та зручність роботи користувачів. Однак нам все ще потрібно перевірити унікальність ще раз у RegisterCommand , і, очевидно, ми НЕ повинні отримувати доступ до ReadModel у командах.
Якщо ми не використовуємо джерело подій, ми можемо запитати модель домену, тож це не проблема. Але якщо ми використовуємо джерело подій, ми не можемо запитувати модель домену, то як ми можемо перевірити унікальність UserName у реєстріCommand?
Примітка: Клас користувача має властивість Id, а UserName не є ключовою властивістю класу User. Ми можемо отримати об’єкт домену за ідентифікатором, лише використовуючи джерело подій.
ДО: В вимозі, якщо введене Ім'я користувача вже зайняте, веб-сайт повинен показати повідомлення про помилку "Вибачте, ім'я користувача XXX недоступне" для відвідувача. Неприйнятно показувати повідомлення відвідувачеві, кажучи: "Ми створюємо ваш обліковий запис, зачекайте, результат реєстрації ми надішлемо вам електронною поштою пізніше".
Будь-які ідеї? Дуже дякую!
[ОНОВЛЕННЯ]
Більш складний приклад:
Вимога:
Розміщуючи замовлення, система повинна перевіряти історію замовлень клієнта, якщо він є цінним клієнтом (якщо клієнт робив щонайменше 10 замовлень на місяць за останній рік, він є цінним), ми робимо знижку 10% на замовлення.
Реалізація:
Ми створюємо PlaceOrderCommand, і в команді нам потрібно запитати історію замовлень, щоб перевірити, чи цінний клієнт. Але як ми можемо це зробити? Ми не повинні отримувати доступ до ReadModel за командою! Як сказав Мікаель , ми можемо використовувати компенсуючі команди в прикладі реєстрації облікового запису, але якщо ми також використовуємо це в цьому прикладі впорядкування, це буде занадто складно, і код може бути занадто складним для обслуговування.