zoukankan      html  css  js  c++  java
  • .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>();比较麻烦每次新增都需要添加一次注入 所以我们使用批量的注入,来减少麻烦,通过反射获取所有的验证的类批量注入
        /// <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
  • 相关阅读:
    我的Java学习路线图
    请求重定向和请求转发的区别
    PHP代码审计学习-php安全基础
    无密码正向直连内网linux目标机复现
    Windows API 学习
    Http请求走私
    免杀手法-tcp套字节传递shellcode学习
    自启动模块构造-计划任务
    自启动模块构造-快速启动目录
    进程注入免杀学习
  • 原文地址:https://www.cnblogs.com/lifeng618/p/11988236.html
Copyright © 2011-2022 走看看