private async Task <ResponseMessage> CreateCustomer(CreateNewUserCommand message) { var user = await _userRegisterProvider.FindByEmailAsync(message.Email).ConfigureAwait(false); var userSaved = new UserSaveIntegrationEvent(Guid.Parse(user.Id), message.Name, user.Email, message.IdentityNumber); try { var result = await _messageBus.RequestAsync <UserSaveIntegrationEvent, ResponseMessage>(userSaved).ConfigureAwait(false); if (!result.IsValid()) { var @event = new UserCanceledEvent(Guid.Parse(user.Id), message.IdentityNumber, message.Name, message.Email); @event.ValidationResult = result.ValidResult; await _mediator.PublishEvent(@event); return(result); } await _mediator.PublishEvent(new CustomerCreatedEvent(result.AggregateId, message.Name, message.Email)).ConfigureAwait(false); return(result); } catch (Exception ex) { var @event = new UserCanceledEvent(Guid.Parse(user.Id), message.IdentityNumber, message.Name, message.Email); @event.ValidationResult.Errors.Add(new FluentValidation.Results.ValidationFailure(string.Empty, ex.Message)); await _mediator.PublishEvent(@event).ConfigureAwait(false); return(new ResponseMessage(@event.ValidationResult)); } }
private async Task <ResponseMessage> SaveCustomer(UserSaveIntegrationEvent message) { var customerCommand = new SaveCustomerCommand(message.AggregateId, message.Name, message.Email, message.IdentityNumber); CommandResult <ValidationResult> result; using (var scope = _serviceProvider.CreateScope()) // Create scope inside the singleton (Lifecicle scope) { //Basically service locator is used When it is outside the context or when the class cannot pass arguments through the constructor var mediator = scope.ServiceProvider.GetRequiredService <IMediatorHandler>(); result = await mediator.SendCommand <SaveCustomerCommand, ValidationResult>(customerCommand); } var responseMessage = new ResponseMessage(result.ValidationResult); responseMessage.AggregateId = message.AggregateId; return(responseMessage); }