using FluentValidation; using FluentValidation.Results; using MediatR; namespace Shared.Application.Behaviors; /// /// MediatR pipeline behavior that runs all registered FluentValidation validators for a /// request before invoking its handler, short-circuiting with a /// when any validator reports failures. /// public class ValidationBehavior(IEnumerable> validators) : IPipelineBehavior where TRequest : IRequest { public async Task Handle( TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken ) { if (!validators.Any()) return await next(); ValidationContext context = new(request); List failures = ( await Task.WhenAll(validators.Select(v => v.ValidateAsync(context, cancellationToken))) ) .SelectMany(result => result.Errors) .Where(failure => failure != null) .ToList(); if (failures.Count > 0) throw new ValidationException(failures); return await next(); } }