using FluentValidation; 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(); } var context = new ValidationContext(request); var 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(); } }