需求来源:

在日常工作中,业务流程往往就是大量持续的数据流转、加工、展现过程,在这个过程中,不可避免的就是数据验证的工作。数据验证工作是个很枯燥的重复劳动,没有什么技术含量,需要的就是对业务流程的准确理解以及细心耐心。在实际生产环境中,经常出现业务BUG最终检查是由于数据验证不到位,最终导致加工数据的结果不合理。整个排查过程也是费时费力,因此,希望能够提供便捷的数据验证方式。

在System.ComponentModel.DataAnnotations命名空间中,微软定义了一系列的Attribute,用于数据验证工作,功能很全面,但也有一些需求(如GreaterThan,LessThan)需要自定义实现,因此考虑根据实际项目需求,定制化一套需要的数据验证Attribute,并提供一个泛型extension验证方法,这样可以随时按需对当前对象实例进行数据验证。

实现过程:

实现非常简单,两个步骤:

1:按需自定义数据验证Attribute,如下实现了Range及LessThan:

[AttributeUsage(AttributeTargets.Property)]
    public class RangeAttribute : Attribute
    {
        public double Min { get; set; }
        public double Max { get; set; }
        public string ErrorMsg { get; set; }

        public RangeAttribute(int minValue, int maxValue, string errorMessage = "Argument out of range")
        {
            Min = minValue;
            Max = maxValue;
            ErrorMsg = errorMessage;
        }
    }

[AttributeUsage(AttributeTargets.Property)]
    public class LessThanAttribute : Attribute
    {
        public double Threshold { get; set; }
        public string ErrorMsg { get; set; }

        public LessThanAttribute(double threshold, string errorMessage = "Argument must less than the threshold")
        {
            Threshold = threshold;
            ErrorMsg = errorMessage;
        }
    }

2:实现泛型extension:

public static void Validate<T>(this T obj)
{
   //TODO: Validate Attribute Handle
}

具体代码较长,为精简版面就不全部贴出了。

(实现在https://github.com/cerasumat/Utilities/tree/master/CeraSumat.Utilities/Validation路径下的Validater.cs文件可以找到)

如何使用:

如下例,定义一个Student类,并按需加入数据验证Attribute,实例化该类后,调用实例的Validate()方法,即可便捷地进行数据验证:

        public class Student
        {
            [MaxLength()]
            [NotEqual("JiaK")]
            public string Name { get; set; }

            [Range(, )]
            [NotEqual()]
            [LessThan(3.5)]
            public int Id { get; set; }
        }
        static void Main(string[] args)
        {
            , Name = "Jiak"};
            s.Validate();
        }    

通过自定义Attribute及泛型extension封装数据验证过程的更多相关文章

  1. vue 自定义指令input表单的数据验证

    一.代码 <template> <div class="check" > <h3>{{msg}}</h3> <div clas ...

  2. MVC 3 数据验证 Model Validation 详解

    在MVC 3中 数据验证,已经应用的非常普遍,我们在web form时代需要在View端通过js来验证每个需要验证的控件值,并且这种验证的可用性很低.但是来到了MVC 新时代,我们可以通过MVC提供的 ...

  3. (转)MVC 3 数据验证 Model Validation 详解

    继续我们前面所说的知识点进行下一个知识点的分析,这一次我们来说明一下数据验证.其实这是个很容易理解并掌握的地方,但是这会浪费大家狠多的时间,所以我来总结整理一下,节约一下大家宝贵的时间. 在MVC 3 ...

  4. <转>ASP.NET学习笔记之MVC 3 数据验证 Model Validation 详解

    MVC 3 数据验证 Model Validation 详解  再附加一些比较好的验证详解:(以下均为引用) 1.asp.net mvc3 的数据验证(一) - zhangkai2237 - 博客园 ...

  5. Programming With Objective-C---- Encapsulating Data ---- Objective-C 学习(三) 封装数据

      Programming with Objective-C Encapsulating Data In addition to the messaging behavior covered in t ...

  6. XsdGen:通过自定义Attribute与反射自动生成XSD

    前言 系统之间的数据交互往往需要事先定义一些契约,在WCF中我们需要先编写XSD文件,然后通过自动代码生成工具自动生成C#对象.对于刚刚接触契约的人来说,掌握XMLSpy之类的软件之后确实比手写XML ...

  7. MVC数据验证原理及自定义ModelValidatorProvider实现无编译修改验证规则和错误信息

    Asp.net MVC中的提供非常简单易用的数据验证解决方案. 通过System.ComponentModel.DataAnnotations提供的很多的验证规则(Required, StringLe ...

  8. Java实战之01Struts2-03属性封装、类型转换、数据验证

    九.封装请求正文到对象中 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. 原因:是由一个staticParams的拦截器完成注入的. 2.动态参数封装: ...

  9. C#自定义Attribute值的获取与优化

    C#自定义Attribute值的获取是开发中会经常用到的,一般我们的做法也就是用反射进行获取的,代码也不是很复杂. 1.首先有如下自定义的Attribute [AttributeUsage(Attri ...

随机推荐

  1. using语法糖

    资源的分类 首先说一下资源的分类: 托管资源:由CLR管理分配和释放资源 非托管资源:不受CLR管理的对象,如 文件(StreamReader,BinaryReader,DataTable,各种Str ...

  2. cookie与session的爱恨情仇

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

  3. [bzoj3289]Mato的文件管理

    Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能 ...

  4. net对XML增删改查

    Pass:看公司代码,配置下拉框的功能,和下拉框的数字转文字.配置xml里面有下拉的value,name,这样界面直接显示数字,然后转译成中文 1.xml文件格式 <?xml version=& ...

  5. jquery无缝间歇向上滚动(间断滚动)

    jquery无缝间歇向上滚动 JS部份 $(function(){ var $this = $(".renav"); var scrollTimer; $this.hover(fu ...

  6. js中三个对数组操作的函数 indexOf()方法 filter筛选 forEach遍历 map遍历

     indexOf()方法  indexOf()方法返回在该数组中第一个找到的元素位置,如果它不存在则返回-1. 不使用indexOf时 var arr = ['apple','orange','pea ...

  7. Java集合系列:-----------03ArrayList源码分析

    上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayLi ...

  8. Visual Studio 2013编辑HTML文件无设计视图的解决方案

    在Visual Studio 2013中编辑HTML文件,会发现没有设计视图. 解决方法:点击Visual Studio 2013的”工具“菜单,再点击”选项“—>文本编辑器—>文件扩展名 ...

  9. 十大经典排序算法总结——JavaScrip版

    首先,对于评述算法优劣术语的说明: 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:即排序后2个相等键值的顺序和排序之前它们的顺序相同 不稳定:如果a原本在b的前面,而a=b,排序之后a ...

  10. swift 定时器的使用

    在swift中,要使用定时器就需要用到对象NSTimer.通过NSTimer的实例化后,就可以调用fire方法来启用了. NSTimer有2个构造函数 init(timeInterval ti: NS ...