为什么要使用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

.Net Core3.0 WEB API 中使用FluentValidation验证,实现批量注入的更多相关文章

  1. Web API中的模型验证

    一.模型验证的作用 在ASP.NET Web API中,我们可以使用 System.ComponentModel.DataAnnotations 命名空间中的属性为模型上的属性设置验证规则. 一个模型 ...

  2. Web API中的模型验证Model Validation

    数据注释 在ASP.NET Web API中,您可以使用System.ComponentModel.DataAnnotations命名空间中的属性为模型上的属性设置验证规则. using System ...

  3. ASP.NET Web API 中的返回数据格式以及依赖注入

    本篇涉及ASP.NET Web API中的返回数据合适和依赖注入. 获取数据 public IEnumerable<Food> Get() { var results = reop.Get ...

  4. .net core3.1 web api中使用newtonsoft替换掉默认的json序列化组件

    在微软的文档中,有着较为详细的替换教程 https://docs.microsoft.com/zh-cn/aspnet/core/web-api/advanced/formatting?view=as ...

  5. 【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理

    原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...

  6. Web APi 2.0优点和特点?在Web APi中如何启动Session状态?

    前言 曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此 ...

  7. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  8. 在ASP.NET Web API中使用OData

    http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...

  9. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新 ...

随机推荐

  1. "Dependency on app with no migrations: %s" % key[0]

    问题描述:我在model中建好模型类,运行的控制台就报错误: 解决方法:1,首先需要在setting中重载AUTH_USER_MODEL AUTH_USER_MODEL = 'users.UserPr ...

  2. 使用linq实现回调函数

    通过输入的Id找到parentId是该Id的列表,然后找到parentId是上面那个Id的列表,以此类推,找到第一目录下所有子目录的的列表. 通过传入第一目录的Id,得到该目录下的所有子目录. 通过回 ...

  3. Flask:项目的准备工作

    1.创建虚拟环境 (1)打开Windows命令窗口,输入命令(先确保电脑上安装了Anaconda): conda create -n FlaskPath python=3.5.2 FlaskPath为 ...

  4. .NET Core 又一杀器! Web Blazor框架横空出世!

    多年来,Javascript(及其子框架)已在浏览器中运行DOM(文档对象模型),并且掌握了脚本知识才能真正操作客户端UI.大约2年前,所有这些都随着Web Assembly的引入而发生了变化-Web ...

  5. VS Code 1.40 发布!可自行搭建 Web 版 VS Code!

    今天(北京时间 2019 年 11 月 8 日),微软发布了 Visual Studio Code 1.40 版本.让我们来看看有哪些主要的更新. 自建 Web 版 VS Code 前不久,微软正式发 ...

  6. Apache Solr Velocity模板远程代码执行复现

    0x01漏洞描述 2019年10月31日,国外安全研究员s00py在Github公开了一个Apache Solr Velocity模板注入远程命令执行的poc. 经过研究,发现该0day漏洞真实有效并 ...

  7. AutoCad 二次开发 .net 之相同块的自动编号

    主要步骤: 一.获取一个块的id: 其中oId就是了. 二.通过次oId获取块引用blkRef: 三.通过它获取所有相同的块引用的id集合: 四.通过步骤三的集合得到所有的块引用得到集合listBr: ...

  8. 【POJ3208】Apocalypse Someday

    Description 666号被认为是神秘的"野兽之数",在所有以启示录为主题的大片中都是一个被广泛使用的数字.但是,这个数字666不能总是在脚本中使用,所以应该使用1666这样 ...

  9. __new__与__init__的区别和应用场景

    创建实例的时候, 先运行的_new_方法, _new_创建对象 Student object(实例)返回给 _init_ 里面的第一个参数self class Student(object): def ...

  10. java VS c#,异同点

    因工作安排,后期需要维护一个java项目.所以稍微熟悉下java,开此篇记录下java与c#的区别点,方便增强自己学习效果.肯定是不全的,可能是有错的,欢迎批评指正. 一.关键字 描述 C# Java ...