using FluentValidation; using MediatR; namespace TakeoutSaaS.Application.App.Common.Behaviors; /// /// MediatR 请求验证行为,统一触发 FluentValidation。 /// /// 请求类型。 /// 响应类型。 public sealed class ValidationBehavior(IEnumerable> validators) : IPipelineBehavior where TRequest : notnull, IRequest { private readonly IEnumerable> _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 is not null).ToList(); if (failures.Count > 0) { throw new ValidationException(failures); } } return await next(); } }