zoukankan      html  css  js  c++  java
  • Net Core3.0 WEB API 中使用FluentValidation

    Net Core3.0 WEB API 中使用FluentValidation

    阅读目录

    为什么要使用FluentValidation

    1.在日常的开发中,需要验证参数的合理性,不紧前端需要验证传毒的参数,后端也需要验证参数
    2.在领域模型中也应该验证,做好防御性的编程是一种好的习惯(其实以前重来不写的,被大佬教育了一番)
    3.FluentValidation 是.NET 开发的验证框架,开源,主要是简单好用,内置了一些常用的验证器,可以直接使用,扩展也很方便

    使用FluentValidation


    1.引入FluentValidation.AspNetCore NuGet包
    2.建立需要验证的类

    复制代码
    /// <summary>
    /// 创建客户
    /// </summary>
    public class CreateCustomerDto
    {
        /// <summary>
        /// 客户姓名
        /// </summary>
        public string CustomerName { get; set; }
        /// <summary>
        /// 客户年龄
        /// </summary>
        public string CustomerAge { get; set; }
        /// <summary>
        /// 客户电话
        /// </summary>
        public string CustomerPhone { get; set; }
        /// <summary>
        /// 客户地址
        /// </summary>
        public Address CustomerAddress { get; set; }
    }
    
    /// <summary>
    /// 验证
    /// </summary>
    public class CreateCustomerDtoValidator : AbstractValidator<CreateCustomerDto>
    {
        public CreateCustomerDtoValidator()
        {
            RuleFor(x => x.CustomerName)
                  .NotEmpty()
                  .WithMessage("客户姓名不能为空");
            RuleFor(x => x.CustomerPhone)
                  .NotEmpty()
                  .WithMessage("客户电话不能为空");
    
        }
    }
    复制代码

    3.统一返回验证的信息,ResponseResult为全局统一参数返回的类

    复制代码
        /// <summary>
        /// 添加AddFluentValidationErrorMessage
        /// </summary>
        /// <returns></returns>
        public DependencyInjectionService AddFluentValidationErrorMessage()
        {
            _services.Configure<ApiBehaviorOptions>(options =>
            {
                options.InvalidModelStateResponseFactory = (context) =>
                {
                    var errors = context.ModelState
                        .Values
                        .SelectMany(x => x.Errors
                                    .Select(p => p.ErrorMessage))
                        .ToList();
                    var result = new ResponseResult<List<string>>
                    {
                        StatusCode = "00009",
                        Result = errors,
                        Message = string.Join(",", errors.Select(e => string.Format("{0}", e)).ToList()),
                        IsSucceed = false
                    };
    
                    return new BadRequestObjectResult(result);
                };
            });
            return _dependencyInjectionConfiguration;
        }
    复制代码

    4.注入验证的类
    使用builder.RegisterType().As<IValidator>();比较麻烦每次新增都需要添加一次注入
    所以我们使用批量的注入,来减少麻烦,通过反射获取所有的验证的类批量注入

    复制代码
        /// <summary>
        /// 添加MVC
        /// </summary>
        /// <returns></returns>
        public DependencyInjectionService AddMvc()
        {
            _services.AddControllers(options => 
            { 
                options.Filters.Add(typeof(LogHelper));
            }).AddJsonOptions(options =>
            {
                //忽略循环引用
                //options.JsonSerializerOptions.IgnoreReadOnlyProperties = true;
            }).AddFluentValidation(options =>
            {
                options.RunDefaultMvcValidationAfterFluentValidationExecutes = false;
                var validatorList = GetFluentValidationValidator("ConferenceWebApi");
                foreach (var item in validatorList)
                {
                    options.RegisterValidatorsFromAssemblyContaining(item);
                }
            });
            return _dependencyInjectionConfiguration;
        }
    
        /// <summary>
        /// 获取所有的FluentValidation Validator的类
        /// </summary>
        public IEnumerable<Type> GetFluentValidationValidator(string assemblyName)
        {
            if (assemblyName == null)
                throw new ArgumentNullException(nameof(assemblyName));
            if (string.IsNullOrEmpty(assemblyName))
                throw new ArgumentNullException(nameof(assemblyName));
    
            var implementAssembly = RuntimeHelper.GetAssembly(assemblyName);
            if (implementAssembly == null)
            {
                throw new DllNotFoundException($"the dll ConferenceWebApi not be found");
            }
            var validatorList = implementAssembly.GetTypes().Where(e => e.Name.EndsWith("Validator"));
            return validatorList;
        }
    复制代码

    5.使用起来就十分简单了

    复制代码
        /// <summary>
        /// 创建客户
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResponseResult<string>> CreateCustomer([FromBody] CreateCustomerDto input)
        {
            var createCustomerCommand = new CreateCustomerCommand(input.CustomerName,input.CustomerAge,input.CustomerPhone,input.CustomerAddress);
            await _commandService.SendCommandAsync(createCustomerCommand);
            var result = new ResponseResult<string>
            {
                IsSucceed = true,
                Result = "创建客户成功!"
            };
            return result;
        }
    复制代码

    FluentValidation学习的资料

    感谢大佬们的分享,零度编程中的教程非常的全面,包括了许多的验证器的使用,记不住时直接可以翻阅查看
    零度编程:https://www.xcode.me/post/5849
    Lamond Lu:https://www.cnblogs.com/lwqlun/p/10311945.html

  • 相关阅读:
    indexDB的用法
    append动态生成的元素,无法触发事件的原因及解决方案
    jquery中attr()和prop()的区别
    arguments.callee
    meter标签度量衡如何改变颜色
    Nginx入门
    linux中的权限管理
    python_面向对象
    ORM
    Flask入门
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/12290006.html
Copyright © 2011-2022 走看看