学习.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

相关推荐
dax.net4 天前
.NET云原生应用实践(五):使用Blazor WebAssembly实现前端页面
微服务·asp.net core
河西石头7 天前
完整了解asp.net core MVC中的数据传递
后端·asp.net·mvc·asp.net core·core mvc数据传递·视图控制器的数据传递
dax.net10 天前
.NET云原生应用实践(四):基于Keycloak的认证与授权
微服务·asp.net core
棉晗榜15 天前
asp.net core会话session设置滑动过期时间
后端·asp.net core
dax.net16 天前
.NET云原生应用实践(三):连接到PostgreSQL数据库
微服务·asp.net core
dax.net25 天前
.NET云原生应用实践(二):Sticker微服务RESTful API的实现
.net·asp.net core
dax.net1 个月前
.NET云原生应用实践(一):从搭建项目框架结构开始
.net·asp.net core
小乖兽技术2 个月前
详解Asp.Net Core管道模型中的五种过滤器的适用场景与用法
后端·asp.net core·管道机制
界面开发小八哥2 个月前
界面控件Telerik UI for ASP.NET Core 2024 Q2亮点 - AI与UI的融合
人工智能·ui·asp.net·asp.net core·telerik
饭勺oO3 个月前
Elsa V3学习之Flowchart详解(上)
c#·asp.net core·.net core·工作流·elsa