Архитектурно не нужно отдавать ApiError.
У web приложения должны быть стандартизированны ошибки, а значит их формат должен генериться в единой точке кода.
Поэтому нужно просто обрабатывать результат валидации от FluentValidation. Примерно так:
public sealed class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : class, IRequest<TResponse>
{
private readonly IEnumerable<IValidator<TRequest>> validators;
public ValidationBehavior(IEnumerable<IValidator<TRequest>> validators)
{
this.validators = validators;
}
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
if (!validators.Any())
{
return await next();
}
var errors = new List<ValidationFailure>();
var context = new ValidationContext<TRequest>(request);
foreach (var validator in validators)
{
var validationResult = await validator.ValidateAsync(context);
if (validationResult.Errors != null && validationResult.Errors.Count > 0)
errors.AddRange(validationResult.Errors);
}
if (errors.Any())
{
throw new ValidationException(errors);
}
return await next();
}
}
Что преобразует результат валидации в ваш Exception (ValidationException).
Который вы уже просто перехватываете в ExceptionFilter, что реализован на примере:
public class ApiExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
// Тут отдаете уже стандартизированный ответ на варианты ошибок с правильно прописанным Status Code
}
}