我正在使用 FluentValidation 11.5.1。 我不想使用:
// MapPost //
public static void AddUser([FromBody] UserRequest, [FromServices] IValidator<UserRequest> validator)
我希望它是自动的:
public static void AddUser([FromBody] UserRequest)
{
If it will fail, it would show the errors and wouldn't get here,
Without to injecting the validator.
}
在Program.cs中,我使用了:
services.AddMvc().AddFluentValidation() - it's deprecated and minimal api is not mvc.
但没有成功。
- 验证器如何在不注入(inject)验证器的情况下自动验证请求?
- 来自客户端的请求 -> EndPoint: AddUser([FromBody] UserRequest) -> 如果它无法通过验证,您将从 FluentValidation 收到错误,而无需“[FromServices] IValidator validator”在端点中注入(inject)验证器,有点就像数据注释一样。
最佳答案
据我所知,目前没有任何内置内容。您可以查看一些第三方库,例如 O9d.AspNet.FluentValidation
其中包含验证过滤器以支持流畅的验证。
其他选项:
- 编写您自己的验证过滤器,如this answer 。让您开始:
public class ValidationFilter<T> : IEndpointFilter where T : class
{
private readonly IValidator<T> _validator;
public ValidationFilter(IValidator<T> validator)
{
_validator = validator;
}
public async ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next)
{
var obj = context.Arguments.FirstOrDefault(x => x?.GetType() == typeof(T)) as T;
if (obj is null)
{
return Results.BadRequest();
}
var validationResult = await _validator.ValidateAsync(obj);
if (!validationResult.IsValid)
{
return Results.BadRequest(string.Join("/n", validationResult.Errors));
}
return await next(context);
}
}
// and usage
app.MapPost("api/user", (Example e) => e)
.AddEndpointFilter<ValidationFilter<Example>>();
- 通过创建包装器来利用绑定(bind)机制 ( for example ),该包装器将解析传入的 json 并执行验证。
关于c# - FluentValidation 自动验证请求 .NET 7 Minimal API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75735862/