using FluentValidation; using MediatR; namespace MyNewProjectName.Application.Behaviors; /// /// Validation behavior for MediatR pipeline /// public class ValidationBehavior : IPipelineBehavior where TRequest : notnull { private readonly IEnumerable> _validators; public ValidationBehavior(IEnumerable> validators) { _validators = validators; } public async Task Handle(TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) { if (!_validators.Any()) { return await next(); } var context = new ValidationContext(request); var validationResults = await Task.WhenAll( _validators.Select(v => v.ValidateAsync(context, cancellationToken))); var failures = validationResults .Where(r => r.Errors.Any()) .SelectMany(r => r.Errors) .ToList(); if (failures.Any()) { var errors = failures .GroupBy(e => e.PropertyName, e => e.ErrorMessage) .ToDictionary(g => g.Key, g => g.ToArray()); throw new MyNewProjectName.Domain.Exceptions.ValidationException(errors); } return await next(); } }