学习.NET验证模块FluentValidation的基本用法(续3:ASP.NET Core中的调用方式)

FluentValidation模块支持在ASP.NET Core项目中进行手工或自动验证,主要验证方式包括以下三种:
  1)手工注册验证类,并在控制器或其它模块中调用验证;
  2)基于ASP.NET验证管道(validation pipeline)自动验证;
  3)基于过滤器自动验证。
  定义以下数据类及验证类,学习并测试上述三种验证方式:

csharp 复制代码
//数据类及验证类定义
public class AppUser
{
    public string UserName { get; set; }
    public string Sex { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}

public class AppUserValidator : AbstractValidator<AppUser>
{
    public AppUserValidator()
    {
        RuleFor(r => r.UserName).NotEmpty().WithMessage("姓名不能为空");
        RuleFor(r => r.Age).GreaterThan(10).WithMessage("年龄必须超过10岁");
        RuleFor(r => r.Email).EmailAddress();
    }
}

首先是手工注册及验证,新建WebApi项目,在Program文件中手工注册验证接口及对应验证类,然后在控制器中调用验证,示例代码及效果如下所示。除了手工注册,FluentValidation还提供自动注册函数,不需要手工逐个注册,详细介绍见下面代码中的注释。

csharp 复制代码
//program.cs中注册
//这里也可以安装FluentValidation.DependencyInjectionExtensions包,然后
//在program.cs中调用builder.Services.AddValidatorsFromAssemblyContaining<AppUserValidator>();
//AddValidatorsFromAssemblyContaining函数会将AppUserValidator所在程序集中
//所有继承自IValidator的验证类自动注册
builder.Services.AddScoped<IValidator<AppUser>, AppUserValidator>();

//controller类中使用
public class UserController : ControllerBase
{
    private readonly IValidator<AppUser> _user;  

    public UserController(IValidator<AppUser> user)
    {
        _user = user;
    }

    [HttpPost]
    public string NewUser(AppUser user) 
    {
        FluentValidation.Results.ValidationResult result= _user.Validate(user);
        if (result.IsValid) 
        {
            return "验证成功";
        }
        else
        {
            return result.ToString();
        }
    }
}


  第二种方式是基于ASP.NET验证管道自动验证 ,但FluentValidation官网文档中已不推荐这种方式,原因包括以下几点:
  a)ASP.NET验证管道不支持异步,如果验证类中有异步操作,则验证类无法执行且会抛异常;
  b)验证管道仅支持MVC和Razor,不支持Minimal APIs、Blazor等;
  c)难以调试。自动验证模式难以调试程序问题。
  基于ASP.NET验证管道自动验证时,只需在Program文件中调用AddFluentValidationAutoValidation函数(需安装FluentValidation.AspNetCore包)并注册验证接口及对应验证类即可。ASP.NET Core项目在调用控制器函数前会自动调用验证类进行验证。示例代码及运行效果如下所示:

csharp 复制代码
//program.cs中注册
builder.Services.AddFluentValidationAutoValidation();
builder.Services.AddValidatorsFromAssemblyContaining<AppUserValidator>();

基于过滤器自动验证 需安装SharpGrip.FluentValidation.AutoValidation 包(详细介绍见参考文献3),该包的使用方式和基于ASP.NET验证管道自动验证类似,只需在program文件中添加相应函数即可,示例代码如下所示:

csharp 复制代码
//program.cs中注册
using SharpGrip.FluentValidation.AutoValidation.Mvc.Extensions;

builder.Services.AddFluentValidationAutoValidation();
builder.Services.AddValidatorsFromAssemblyContaining<AppUserValidator>();

参考文献:

[1]https://docs.fluentvalidation.net/en/latest/start.html

[2]https://github.com/FluentValidation/FluentValidation.AspNetCore#aspnet-core-integration-for-fluentvalidation

[3]https://github.com/SharpGrip/FluentValidation.AutoValidation

相关推荐
棉晗榜6 天前
.net core在linux导出excel,System.Drawing.Common is not supported on this platform
linux·excel·asp.net core·miniexcel
棉晗榜6 天前
asp.net core发布配置端口号,支持linux
asp.net core
coredx9 天前
如何优雅地让 ASP.NET Core 支持异步模型验证
asp.net core
小乖兽技术16 天前
ASP.NET Core Web 项目的部署:选择 IIS 还是 Kestrel?
后端·kestrel·iis·asp.net·asp.net core
界面开发小八哥18 天前
DevExtreme JS & ASP.NET Core v24.2新功能预览 - 全新的聊天组件
javascript·ui·asp.net core·界面控件·ui开发·devextreme·.net 9
宋冠巡20 天前
Spring Boot Validation 封装自定义校验注解和校验器(validation-spring-boot-starter)
spring boot·参数校验·validation
gc_229923 天前
学习ASP.NET Core的身份认证(基于Session的身份认证3)
asp.net core·session·身份认证
gc_229924 天前
ASP.NET Core项目中使用SqlSugar连接多个数据库的方式
asp.net core·sqlsugar·多数据库
gc_229925 天前
学习ASP.NET Core的身份认证(基于Session的身份认证1)
asp.net core·session·身份认证
gc_22991 个月前
学习ASP.NET Core的身份认证(基于Cookie的身份认证1)
asp.net core·cookie·身份认证