自从 .NET 6 中发布以来,我一直在使用 Minimal API。为了进行验证,我一直使用手动方法,如下所示:
app.MapPost("api/user", async ([FromService] IValidator<UserDto> validator, [FromBody] UserDto user) =>
{
var validationResult = await validator.ValidateAsync(user);
if (!validationResult.IsValid)
{
return Results.BadRequest(string.Join("/n", validationResult.Errors));
}
...
})
随着 .NET 7 新版本的发布,包括Filters https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis/min-api-filters?view=aspnetcore-7.0。我已经继续实现了一些功能。我创建了自定义验证过滤器,如下所示:
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);
}
}
我现在可以通过调用使用上面的内容AddEndPointFilter<T>()
所以像这样:
app.MapPost("api/user", (..) => { ... }).AddEndPointFilter<ValidationFilter>();
上面的效果很好。不过,我有一些RuleSet()
在我的 FluentValidation 中,我将其包含在PUT
要求。所以我的问题是,如何将规则集传递给我的ValidationFilter
?