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

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

  定义以下数据类及验证类,学习并测试上述三种验证方式:

//数据类及验证类定义
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还提供自动注册函数,不需要手工逐个注册,详细介绍见下面代码中的注释。

//program.cs中注册
//这里也可以安装FluentValidation.DependencyInjectionExtensions包,然后
//在program.cs中调用builder.Services.AddValidatorsFromAssemblyContaining();
//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();
        }
    }
}

学习.NET验证模块FluentValidation的基本用法(续3:ASP.NET Core中的调用方式)_第1张图片
  第二种方式是基于ASP.NET验证管道自动验证,但FluentValidation官网文档中已不推荐这种方式,原因包括以下几点:
  a)ASP.NET验证管道不支持异步,如果验证类中有异步操作,则验证类无法执行且会抛异常;
  b)验证管道仅支持MVC和Razor,不支持Minimal APIs、Blazor等;
  c)难以调试。自动验证模式难以调试程序问题。

  基于ASP.NET验证管道自动验证时,只需在Program文件中调用AddFluentValidationAutoValidation函数(需安装FluentValidation.AspNetCore包)并注册验证接口及对应验证类即可。ASP.NET Core项目在调用控制器函数前会自动调用验证类进行验证。示例代码及运行效果如下所示:

//program.cs中注册
builder.Services.AddFluentValidationAutoValidation();
builder.Services.AddValidatorsFromAssemblyContaining<AppUserValidator>();

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

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

//program.cs中注册
using SharpGrip.FluentValidation.AutoValidation.Mvc.Extensions;

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

学习.NET验证模块FluentValidation的基本用法(续3:ASP.NET Core中的调用方式)_第3张图片
参考文献:
[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

你可能感兴趣的:(网页编程,dotnet编程,ASP.NET,Core,Fluent,Validation)