public async Task Execute(ExecutionContext context, AsyncPipeline <ExecutionContext> .NextDelegate next)
        {
            var applicableValidators = validators.Where(v => v.CanValidateInstancesOfType(context.Request.GetType()));
            var validationContext    = new ValidationContext(context.Request)
            {
                RootContextData = { [ExecutionContextKey] = context }
            };

            var validationMessageBuilder = new StringBuilder();
            var isInvalid = false;

            foreach (var validator in applicableValidators)
            {
                var validationResult =
                    await validator.ValidateAsync(validationContext).ConfigureAwait(false);

                if (!validationResult.IsValid)
                {
                    validationMessageBuilder.AppendLine(validationResult.ToString());
                    isInvalid = true;
                }
            }

            if (!isInvalid)
            {
                await next.Invoke().ConfigureAwait(false);
            }
            else
            {
                context.Errors.Add(ExecutionErrorType.ValidationFailed, validationMessageBuilder.ToString());
            }
        }
        public async Task <ExecutionResult> Execute(
            IExecutionRequest request,
            IReadOnlyDictionary <string, object> items,
            CancellationToken cancellationToken)
        {
            var logger = serviceProvider.ResolveRequired <ILogger>();

            var context = new ExecutionContext(serviceProvider, logger, request, items, cancellationToken);

            await pipeline.Invoke(context).ConfigureAwait(false);

            return(new ExecutionResult(context.Response, context.Errors));
        }
        internal async Task Dispatch(ExecutionContext context, AsyncPipeline <ExecutionContext> .NextDelegate next)
        {
            foreach (var controller in controllers)
            {
                if (controller.CanExecute(context))
                {
                    await controller.Execute(context).ConfigureAwait(false);

                    return;
                }
            }

            await next.Invoke().ConfigureAwait(false);
        }