using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using FluentValidation; using MediatR; namespace CQRS_Simple.API.PipelineBehaviors { public class ValidationBehavior : IPipelineBehavior where TRequest : IRequest { public readonly IEnumerable> _validators; public ValidationBehavior(IEnumerable> validators) { _validators = validators; } public Task Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate next) { var context = new ValidationContext(request); var failures = _validators .Select(v => v.Validate(context)) .SelectMany(result => result.Errors) .Where(f => f != null) .ToList(); if (failures.Count != 0) { throw new ValidationException(failures); } return next(); } } }