namespace Indotalent.ConfigBackEnd.Behaviours; using FluentValidation; using MediatR; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; public class ValidationBehaviour : IPipelineBehavior where TRequest : IRequest { private readonly IEnumerable> _validators; public ValidationBehaviour(IEnumerable> validators) { _validators = validators; } public async Task Handle(TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) { if (_validators.Any()) { var context = new ValidationContext(request); var validationResults = await Task.WhenAll( _validators.Select(v => v.ValidateAsync(context, cancellationToken))); var failures = validationResults .SelectMany(r => r.Errors) .Where(f => f != null) .ToList(); if (failures.Count != 0) { throw new ValidationException(failures); } } return await next(); } }