关于简单的 FluentValidation 验证

FluentValidation :  https://github.com/JeremySkinner/FluentValidation

关于为何要使用,因为微软自带的模型验证有点弱,还需要自己去写一大堆的验证。

关于asp.net core的集成 我用的是 FluentValidation.AspNetCore  nuget

直接在addmvc后添加 AddFluentValidation() 就好了 

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddFluentValidation();

我一般用反射注入msdi 

复制代码
  // 注册 Validator 
                var types = assembly.GetTypes().Where(p =>
                    p.BaseType != null && p.BaseType.GetInterfaces().Any(x => x == typeof(IValidator)));
                foreach (var type in types)
                {
                    if (type.BaseType != null)
                    {
                        var genericType = typeof(IValidator<>).MakeGenericType(type.BaseType.GenericTypeArguments[0]);
                        services.AddTransient(genericType, type);
                    }
                }
复制代码

然后这里例举一些比较常用的方法 

以下是我的模型 。

复制代码
 public class UserInput
    {
        public string CustomerId { get; set; }
        public string UserName { get; set; }
        public string PhoneNumber { get; set; }
        public string FullName { get; set; }
        public string Description { get; set; }
        public string UnionId { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
    }
复制代码

这里是我的validator

复制代码
public class UserInputVaildator : AbstractValidator<UserInput>
    {
        public UserInputVaildator()
        {
            RuleFor(m => m.UserName).NotEmpty().WithMessage("登录名是必须的");

            RuleFor(m => m.CustomerId).NotEmpty().WithMessage("客户Id是必须的");
            //当手机号为空的时候就不会再去验证手机号格式是否 因为默认是不会停止验证。
            RuleFor(m => m.PhoneNumber)
                .Cascade(CascadeMode.StopOnFirstFailure)
                .NotEmpty().WithMessage("手机号是必须的")
                .PhoneNumber().WithMessage("手机格式不正确");
            //这里的意思是当 邮箱不为空时采取验证邮箱格式是否正确
            RuleFor(m => m.Email)
                .EmailAddress().When(m => !string.IsNullOrWhiteSpace(m.Email)).WithMessage("邮箱格式不正确");
        }
    }
复制代码

当然,还有一些其他的东西  

   public class TestInput
    {
        public string Grant { get; set; }

        public int  Number { get; set; }
    }
复制代码
public class TestInputValidator : AbstractValidator<TestInput>
    {
        public TestInputValidator()
        {
       RuleSet(
"test", () => { RuleFor(m => m.Number).GreaterThan(0).WithMessage("Number要大于0"); }); RuleFor(m => m.Grant).NotEmpty().WithMessage("Grant不能为空"); } }
复制代码

 规则的设置,可以适应不同的验证场景,对同一个Model进行不同的验证

复制代码
[Route("api/[controller]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        //
        [HttpGet]
        public IActionResult Get([FromQuery]TestInput input)
        {
            return Ok();
        }

        //规则的设置,可以适应不同的验证场景,对同一个Model进行不同的验证
        [HttpPost]
        public IActionResult Index([FromBody][CustomizeValidator(RuleSet = "test")]TestInput input)
        {
            return Ok("213");
        }
    }
    
复制代码

父类,接口的验证 

复制代码
public class CustomerCreateInput : ClientInput, ICustomerInput{
    //具体的实现接口
}

public class CustomerInputInterfaceValidator : AbstractValidator<ICustomerInput>{
  //具体 接口  验证逻辑
}

public class ClientInputVaildators : AbstractValidator<ClientInput>{
  //集体 基类 验证逻辑  
}

//那么我该如果重用接口和基类的验证逻辑
public class CustomerCreateInputValidator : AbstractValidator<CustomerCreateInput>
    {
        public CustomerCreateInputValidator()
        {
            //只需要包含进来
            Include(new CustomerInputInterfaceValidator());
            Include(new ClientInputVaildators());
        }
    }
复制代码

这里就有个问题,如果包含的验证类中包含了 RuleSet,那么该如何启用。因为默认不会启用,这个问题,我也不知道 (~ ̄▽ ̄)~ 只能说我也不太精通,昨天刚刚开始用。
posted @   无语1994  阅读(1719)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示