.NET 7 Minimal API中FluentValidation如何实现自动请求验证?
在.NET 7 Minimal API中用FluentValidation 11.5.1实现自动请求验证
你可以通过FluentValidation.AspNetCore包提供的Minimal API支持来实现自动验证,无需手动注入IValidator<T>,验证失败时直接返回400错误,完全符合你的需求。具体步骤如下:
1. 安装依赖包
首先确保安装对应版本的FluentValidation.AspNetCore:
dotnet add package FluentValidation.AspNetCore --version 11.5.1
2. 配置服务
在Program.cs中注册FluentValidation的自动验证服务,替代已弃用的AddMvc().AddFluentValidation():
var builder = WebApplication.CreateBuilder(args); // 注册FluentValidation自动验证适配 builder.Services.AddFluentValidationAutoValidation() .AddFluentValidationClientsideAdapters(); // 注册你的验证器(二选一即可) // 方式1:单独注册单个验证器 builder.Services.AddScoped<IValidator<UserRequest>, UserRequestValidator>(); // 方式2:批量注册程序集中所有的验证器(更推荐) // builder.Services.AddValidatorsFromAssemblyContaining<UserRequestValidator>(); var app = builder.Build();
3. 定义请求模型和验证规则
创建你的UserRequest模型以及对应的验证器:
public class UserRequest { public string Name { get; set; } public int Age { get; set; } } public class UserRequestValidator : AbstractValidator<UserRequest> { public UserRequestValidator() { RuleFor(x => x.Name) .NotEmpty().WithMessage("用户名不能为空") .MinimumLength(3).WithMessage("用户名长度不能少于3个字符"); RuleFor(x => x.Age) .GreaterThanOrEqualTo(18).WithMessage("年龄必须年满18岁"); } }
4. 编写Minimal API端点
直接将UserRequest作为端点参数,框架会自动执行验证:
app.MapPost("/add-user", (UserRequest request) => { // 只有验证通过才会进入这里,无需手动调用验证方法 return Results.Ok($"用户 {request.Name} 创建成功"); }) .WithName("AddUser") .WithOpenApi(); app.Run();
验证失败的行为
当请求不符合验证规则时,系统会自动返回400 Bad Request,响应体为标准的ProblemDetails格式,包含所有错误信息,和数据注解验证的效果完全一致。
可选自定义配置
如果需要调整验证行为,比如禁用数据注解验证、自定义错误响应格式,可以通过配置选项实现:
builder.Services.AddFluentValidationAutoValidation(config => { // 禁用数据注解验证,只使用FluentValidation的规则 config.DisableDataAnnotationsValidation = true; // 自定义验证失败后的处理逻辑(比如返回自定义响应) config.ValidationFailed += (context, errors) => { context.HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest; context.HttpContext.Response.ContentType = "application/json"; var customErrors = errors.Select(e => new { Field = e.PropertyName, Message = e.ErrorMessage }); return context.HttpContext.Response.WriteAsJsonAsync(customErrors); }; });
内容的提问来源于stack exchange,提问作者Vadim Tomashevsky
相关产品推荐
相关产品推荐

