ASP.NET Core подключает ErrorOr с помощью FluentValidationC#

Место общения программистов C#
Ответить
Anonymous
 ASP.NET Core подключает ErrorOr с помощью FluentValidation

Сообщение Anonymous »

Мне нравится библиотека ErrorOr (страница) и библиотека FluentValidation (page). Я пытаюсь их соединить.
Проверка начинается, но в ответе никогда не отображается результат проверки. Есть ли способ их обернуть.
У меня есть перехватчик проверки (пробовал без него)

Код: Выделить всё

public class FluentvalidationInterceptor : IValidatorInterceptor
{
public ValidationResult AfterAspNetValidation(ActionContext actionContext, IValidationContext validationContext, ValidationResult result)
{
var validationErrors = new List();

if (!result.IsValid)
{
var errors = result.Errors.GroupBy(x => x.PropertyName).ToList();

foreach (var error in errors)
{
var firstError = error.First();
validationErrors.Add(new ValidationFailure(firstError.PropertyName, firstError.ErrorMessage));
}
}

return new ValidationResult(validationErrors);
}

public IValidationContext BeforeAspNetValidation(ActionContext actionContext, IValidationContext commonContext)
{
return commonContext;
}
}
и зарегистрируйте его следующим образом:

Код: Выделить всё

public static WebApplicationBuilder ConfigureFluentValidation(this WebApplicationBuilder builder)
{
builder.Services.Configure(options =>
{
options.SuppressModelStateInvalidFilter = true;
});

builder.Services.AddFluentValidationAutoValidation(options =>
{
options.ToErrorOr();
options.DisableDataAnnotationsValidation = true;
});

builder.Services.AddFluentValidationClientsideAdapters();
builder.Services.AddValidatorsFromAssemblyContaining();

return builder;
}
ErrorOr настраивается следующим образом:

Код: Выделить всё

public static class ExceptionHandlingConfiguration
{
public static IServiceCollection AddGlobalErrorHandling(this IServiceCollection services)
{
services.AddProblemDetails(options =>
{
options.CustomizeProblemDetails = problemDetailsContext =>
{
var errors = problemDetailsContext.HttpContext?.Items[HttpContextItemKeys.Errors] as List;

problemDetailsContext.ProblemDetails.Extensions["traceId"] = problemDetailsContext?.HttpContext?.TraceIdentifier;

if (errors is not null)
{
problemDetailsContext?.ProblemDetails.Extensions.Add("errorCodes", errors);
}
};
});

return services;
}

public static WebApplication UseGlobalErrorHandling(this WebApplication app)
{
app.UseExceptionHandler("/error");

app.Map("/error", (HttpContext httpContext) =>
{
return Results.Problem();
});

return app;
}
}
У меня также есть глобальная конечная точка обработки:

Код: Выделить всё

[ApiController]
[Route("[controller]")]
[ProducesResponseType(typeof(ProblemDetails), (int)HttpStatusCode.InternalServerError)]
public class BaseController :ControllerBase
{
protected IActionResult Problem(ICollection errors)
{
HttpContext.Items[HttpContextItemKeys.Errors] = errors;

if (errors.All(e => e.Type == ErrorType.Validation))
{
var modelStateDictionary = new ModelStateDictionary();

foreach (var error in errors)
{
modelStateDictionary.AddModelError(error.Code, error.Description);
}

return ValidationProblem(modelStateDictionary);
}

if (errors.Any(e => e.Type == ErrorType.Unexpected))
{
return Problem();
}

var firstError = errors.First();

var statusCode = firstError.Type switch
{
ErrorType.NotFound => StatusCodes.Status404NotFound,
ErrorType.Validation => StatusCodes.Status400BadRequest,
ErrorType.Conflict => StatusCodes.Status409Conflict,
_ => StatusCodes.Status500InternalServerError
};

return Problem(statusCode: statusCode, title: firstError.Description);
}
}
Мне интересно узнать, есть ли способ заставить эти две библиотеки работать вместе?

Подробнее здесь: https://stackoverflow.com/questions/792 ... validation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»