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();
}
}