Я пытаюсь начать с микросервисов, поэтому я работаю над игровым проектом, чтобы проверить это. Моя проблема сейчас заключается в регистрации пользователя. У меня есть контроллер в моем шлюзе Api, который принимает запрос и публикует событие на служебной шине (Rabbitmq).
Контроллер шлюза Api:
public async Task<ActionResult> RegisterUser([FromBody] CreateUser createUser)
{
await busClient.PublishAsync(createUser);
return Accepted($"RegisterUser/{createUser.Email}");
}
После этого я просто обрабатываю команду в моем приложении Identity CommandHandler:
public async Task HandleAsync(CreateUser command)
{
try
{
logger.LogInformation($"Creating user: {command.Name}.");
var user = mapper.Map<UserRegister>(command);
var userRegistered = await userService.RegisterAsync(user);
if (userRegistered == null) await busClient.PublishAsync(new CreateUserRejected(command.Email,
"The email is already in use", "400"));
else
await busClient.PublishAsync(new UserCreated(userRegistered.Email, userRegistered.Name));
}
catch (CustomException ex)
{
await busClient.PublishAsync(new CreateUserRejected(command.Email, "Problem saving user.", ex.Code));
logger.LogError(ex.Message);
}
}
Если пользователь не существует, все работает отлично. Моя проблема в том, что когда пользователь уже существует, я хочу отправить событие обратно на свой шлюз Api в виде new CreateUserRejected(command.Email,"The email is already in use", "400")
. Что мне теперь делать? Если я создаю EventHandler для управления событием, как я могу отправить обратно сообщение от EventHandler к контроллеру (чтобы его можно было отобразить моему конечному пользователю) ?. Моя первая идея заключалась в том, чтобы просто проверить локальное хранилище в моем шлюзе Api перед публикацией запроса на служебную шину, но тогда зачем вообще использовать события в случае отказа? Просто ищу лучший способ сделать это.