zoukankan      html  css  js  c++  java
  • 自动化CodeReview

    自动化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(12, MinimumLength = 6, 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": 3,
         "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)
            {
            }
        }
    }
    View Code

    使用ValidateModel需要保证:

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

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

    {
         "errCode": 0, //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了,解决问题后重新运行即可。

  • 相关阅读:
    maven的安装教程
    webstorm的中文教程和技巧分享
    WebStorm
    grunt配置任务
    grunt快速入门
    CSS简介
    浅介HTML DOM
    【转】计算机是如何启动的?
    【转】深入理解C++中public、protected及private用法
    【转】VS2013动态库文件的创建及其使用详解
  • 原文地址:https://www.cnblogs.com/mondol/p/6397281.html
Copyright © 2011-2022 走看看