using FluentValidation; using MediatR; namespace DocumentService.Application.Common.Behaviors; /// /// MediatR Pipeline Behavior that validates requests using FluentValidation /// Executes BEFORE the Handler /// public class ValidationBehavior : IPipelineBehavior where TRequest : IRequest { private readonly IEnumerable> _validators; public ValidationBehavior(IEnumerable> validators) { _validators = validators; } public async Task Handle( TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) { // Wenn keine Validators registriert sind, direkt weiter zum Handler if (!_validators.Any()) { return await next(); } // Validation Context erstellen var context = new ValidationContext(request); // Alle Validators parallel ausführen var validationResults = await Task.WhenAll( _validators.Select(v => v.ValidateAsync(context, cancellationToken)) ); // Fehler sammeln var failures = validationResults .Where(r => !r.IsValid) .SelectMany(r => r.Errors) .ToList(); // Bei Fehlern: ValidationException werfen (wird von Exception Middleware gefangen) if (failures.Any()) { throw new ValidationException(failures); } // Validation erfolgreich ? weiter zum Handler return await next(); } }