예제 #1
0
        /// <inheritdoc />
        public Task ValidateCommand <T>(T command, CommandHandlerDetail handlerDetail)
            where T : ICommand
        {
            // do we have a validator?
            if (handlerDetail?.ValidatorType == null || !handlerDetail.HasValidator)
            {
                // no, so return
                return(Task.CompletedTask);
            }

            var validator = (CommandValidator <T>) this.Resolve(handlerDetail.ValidatorType);

            validator.ConfigureRules();
            var result = validator.Validate(command);

            if (result.IsValid)
            {
                return(Task.CompletedTask);
            }

            var validationErrorsByProperty = result.Errors.GroupBy(e => e.PropertyName);
            var validationErrors           = new Dictionary <string, List <string> >();

            foreach (var propertyErrors in validationErrorsByProperty)
            {
                validationErrors.Add(propertyErrors.Key, propertyErrors.Select(e => e.ErrorMessage).ToList());
            }

            throw new InvalidCommandException(
                      handlerDetail.CommandName,
                      handlerDetail.CommandType.ToString(),
                      validationErrors);
        }
예제 #2
0
        /// <inheritdoc />
        public async Task AuthorizeCommand <T>(
            T command,
            CommandMetadata metadata,
            CommandHandlerDetail handlerDetail,
            Func <CommandMetadata, Task>?onAuthorizationFailed)
            where T : ICommand
        {
            if (handlerDetail.AuthProviderType == null)
            {
                return;
            }

            var authProvider = (ICommandAuthProvider <T>) this.Resolve(handlerDetail.AuthProviderType);

            if (!await authProvider.IsAuthorized(command, metadata))
            {
                if (onAuthorizationFailed == null)
                {
                    throw new UnauthorizedAccessException(
                              "You do not have permission to execute this command.");
                }

                await onAuthorizationFailed(metadata);
            }
        }
예제 #3
0
        /// <inheritdoc />
        public async Task DispatchCommand <T>(T command, CommandMetadata metadata, CommandHandlerDetail handlerDetail)
            where T : ICommand
        {
            var commandHandler = (ICommandHandler <T>) this.Resolve(handlerDetail.HandlerType);

            await commandHandler.HandleAsync(command, metadata);
        }