自动化CodeReview系列目录

  1. 自动化CodeReview - ASP.NET Core依赖注入
  2. 自动化CodeReview - ASP.NET Core请求参数验证

参数验证实现

在做服务端开发时经常需要对客户端传入的参数进行合法性验证,在ASP.NET Core中通常会使用如下方式:

public class LoginModel
{
[Required(ErrorMessage = "账号不能为空")]
public string Account { get; set; }
[StringLength(, MinimumLength = , ErrorMessage = "密码长度应介于6-12个字符之间")]
public string Password { get; set; }
}
public IActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
//参数校验通过,处理登陆逻辑
}
else
{
//参数校验失败,返回第一个错误
var firstErrorMsg = ModelState.GetFirstErrorMessage();
return Content(firstErrorMsg);
}
}

这么写虽然可以验证参数了,但还是要多写一个if...else...,能不能简化成只用一行代码就实现验证呢?

答案是:可以的,先看简化后的用法:

[ValidateModel]
public IActionResult Login(LoginModel model)
{
//能执行到此处表示参数已验证通过
}

以上代码如果Account传空会返回:

{
"errCode": ,
"errMsg": "账号不能为空"
}

与之前的区别是在Action上加了一个[ValidateModel],参数校验逻辑在ValidateModelAttribute里处理,这是MVC里Action过滤器的用法,篇幅限制我就不展开了,直接上代码:

namespace Mondol.WPDental.Web.Filters
{
/// <summary>
/// 确保当前Action的Model是已验证的,否则返回错误响应结果
/// </summary>
public class ValidateModelAttribute : Attribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
var result = new Result(ResultErrorCodes.ArgumentBad, context.ModelState.GetFirstErrorMessage());
context.Result = new JsonResult(result);
}
} public void OnActionExecuted(ActionExecutedContext context)
{
}
}
}

使用ValidateModel需要保证:

1. 项目中有统一的返回格式;例如:JSON或XML

2. 所有接口有统一的公共字段;例如:

{
"errCode": , //0成功,其它值失败
"errMsg": "失败时的错误消息",
"data": {
//成功时的返回数据

}
}

其实对于优秀的项目架构设计,以上2点都不是问题,只有“统一”才可以更好的抽象化代码,封装通用框架。

写到这里其实还不完美,如果Login上的[ValidateModel]忘加了呢?

编译也能通过,测试时还不容易发现。但这实实在在是个BUG,没有校验参数合法性啊。

自动化CodeReview之AutoReview

  我始终坚信再牛掰的程序员也有疏忽的时候,有时写着写着就忘加了。

能不能在忘加的时候提醒一下呢?答案是:可以的。

本系列的第1篇我写了关于【ASP.NET Core依赖注入】的自动化CodeReview,在写参数验证自动化CodeView时我发现自动化CodeView其实有很多可写的。

为了将零散的代码整理到一起,也为了以后可以持续维护下去,我重开了一个项目,项目名暂定AutoReview,PS:大家如果有更好的名字欢迎赐教

项目代码我放到了github上,地址为:https://github.com/md-frank/AutoReview

先来看下它的用法:

先在Startup.ConfigureServices方法最后加入如下代码:

public void ConfigureServices(IServiceCollection services)
{
//注册服务代码放到此处 //此段放在最后
if (_env.IsDevelopment())
{
services.AddAutoReview(
new DependencyInjectionAssert(),
new ValidateModelAssert()
{
ValidateModelAttributeType = typeof(ValidateModelAttribute)
}
);
}
}

AddAutoReview方法接受一个IAssert数组,表示要使用的断言,目前支持2个断言DependencyInjectionAssert、ValidateModelAssert

然后在在Startup.Configure方法中加入如下代码:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
//使用AutoReview,代码位置任意
if (_env.IsDevelopment())
app.UseAutoReview();
}

至此如果任意断言验证失败,UseAutoReview方法都会抛出异常,并提示问题代码的具体位置,终止项目运行。

现在你就可以在开发过程中发现BUG了,解决问题后重新运行即可。

最新文章

  1. nRF24L01芯片控制——迈向无线的第一步
  2. bg,fg,ctrl+z组合
  3. JUQERY 获取同名称的所有CHECKBOX ,获取已经选择的,并且jquery进行勾选!
  4. python之类定义
  5. CoreText实现图文混排之点击事件
  6. 在Windows下搭建C++11 编译环境(附下载,包括mingw-build,TDM-GCC, nuwen MinGW Distro)
  7. Java反射机制小例子
  8. myBatIs.Net 调用Oracle 存储过程返回游标
  9. 使用document.execCommand复制内容至剪贴板
  10. 微信小程序 --- 无法跳转到tab页面问题
  11. oracle伪列
  12. python 基础语法梳理
  13. R 540
  14. HTML 引入Css样式
  15. 原来CNN是这样提取图像特征的。。。
  16. JQuery使用教程
  17. 注册dll文件
  18. Mybatis Plus简介
  19. ES6的新特性(17)——Generator 函数的异步应用
  20. 坑爹的A标签 href

热门文章

  1. JAVA基础--适配器模式
  2. CSU 1515 Sequence
  3. Spring MVC之Action输入参数
  4. iOS开发UITableView基本使用方法总结 分类: ios技术 2015-04-03 17:51 68人阅读 评论(0) 收藏
  5. R Student Companion(R语言初学指南)的源代码_数据_插图
  6. js脚本语言(数组)
  7. Django 设置cookies与获取cookies.
  8. 前端开发 Grunt 之 Connect详解
  9. 支持wmv、mpg、mov、avi格式的网页视频播放代码
  10. MySQL导出以H开头的表