通过自定义Attribute及泛型extension封装数据验证过程

需求来源:

在日常工作中,业务流程往往就是大量持续的数据流转、加工、展现过程,在这个过程中,不可避免的就是数据验证的工作。数据验证工作是个很枯燥的重复劳动,没有什么技术含量,需要的就是对业务流程的准确理解以及细心耐心。在实际生产环境中,经常出现业务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(5)]
            [NotEqual("JiaK")]
            public string Name { get; set; }

            [Range(1, 100)]
            [NotEqual(1)]
            [LessThan(3.5)]
            public int Id { get; set; }
        }
        static void Main(string[] args)
        {
            var s = new Student {Id = 4, Name = "Jiak"};
            s.Validate();
        }    
时间: 2024-10-23 18:47:40

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

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

一.代码 <template> <div class="check" > <h3>{{msg}}</h3> <div class="input"> <input type="text" v-input v-focus><span>{{msg1}}</span> </div> <div class="input"&g

MVC 3 数据验证 Model Validation 详解

续我们前面所说的知识点进行下一个知识点的分析,这一次我们来说明一下数据验证.其实这是个很容易理解并掌握的地方,但是这会浪费大家狠多的时间,所以我来总结整理一下,节约一下大家宝贵的时间. 在MVC 3中 数据验证,已经应用的非常普遍,我们在web form时代需要在View端通过js来验证每个需要验证的控件值,并且这种验证的可用性很低.但是来到了MVC 新时代,我们可以通过MVC提供的数据验证Attribute来进行我们的数据验证.并且MVC 提供了客户端和服务器端 双层的验证,只有我们禁用了客户

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

继续我们前面所说的知识点进行下一个知识点的分析,这一次我们来说明一下数据验证.其实这是个很容易理解并掌握的地方,但是这会浪费大家狠多的时间,所以我来总结整理一下,节约一下大家宝贵的时间. 在MVC 3中 数据验证,已经应用的非常普遍,我们在web form时代需要在View端通过js来验证每个需要验证的控件值,并且这种验证的可用性很低.但是来到了MVC 新时代,我们可以通过MVC提供的数据验证Attribute来进行我们的数据验证.并且MVC 提供了客户端和服务器端 双层的验证,只有我们禁用了客

&lt;转&gt;ASP.NET学习笔记之MVC 3 数据验证 Model Validation 详解

MVC 3 数据验证 Model Validation 详解 在MVC 3中 数据验证,已经应用的非常普遍,我们在web form时代需要在View端通过js来验证每个需要验证的控件值,并且这种验证的可用性很低.但是来到了MVC 新时代,我们可以通过MVC提供的数据验证Attribute来进行我们的数据验证.并且MVC 提供了客户端和服务器端 双层的验证,只有我们禁用了客户端js以后,也会执行服务端验证,所以大大提高了我们的开发进度.今天我们就一起以一个初学者的身份来进入数据验证的殿堂. 首先,

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

Programming with Objective-C Encapsulating Data In addition to the messaging behavior covered in the previous chapter, an object also encapsulates data through its properties. 除了前一章讲述的消息方法(messaging behavior), 对象还能通过它的特性(properties)来封装数据. This chapte

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

前言 系统之间的数据交互往往需要事先定义一些契约,在WCF中我们需要先编写XSD文件,然后通过自动代码生成工具自动生成C#对象.对于刚刚接触契约的人来说,掌握XMLSpy之类的软件之后确实比手写XML效率要高,但还是有些学习成本的.此外XML的tag太多,如果设计的类型属性过多,手写XSD也不太现实,很难专注于设计. 于是我想能不能先用C#写好类型,然后自动生成标准格式的XSD呢.经过三天左右的设计和实现,目前实现了以下功能: 1. 支持Class和Enum类型的设计 2. 支持基元类型.自定义

WinForm TextBox自定义扩展方法数据验证

本文转载:http://www.cnblogs.com/gis-crazy/archive/2013/03/17/2964132.html 查看公司项目代码时,存在这样一个问题:winform界面上有很多信息填写,提交后台服务器更新,但数据的合法验证及值的转换却不太敢恭维,一堆的if判断和转换,便想着是否能扩展个方法出来,琢磨出个思路,记录下来与大家共同探讨,有不对的地方还请大家指正. 设计思路: 1. 由于大部分从TextBox控件中获取数据值,可以扩展个泛型方法出来,直接根据转换后的数据类型

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

九.封装请求正文到对象中 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. 原因:是由一个staticParams的拦截器完成注入的. 2.动态参数封装:开发时用到的 通过用户的表单封装请求正文参数. 2.1.动作类作为实体模型 实体模型:Entity,对应数据库中表的记录(注意类对应的是表结构,而对象对应的是一条记录) 1 public class Demo1Action extends ActionSupport { 2 3 private St

自定义Cell的步骤(封装思想)

一 .用XIB封装View的步骤 1.新建一个xib文件描述一个view的内部结构(假设叫做SDTgCell.xib) ● 2.新建一个自定义的类 (自定义类需要继承自系统自带的view, 继承自哪个类,  取决于xib根对象的Class) ● 3.新建类的类名最好跟xib的文件名保持一致(比如类名就叫做SDTgCell) ● 4.将xib中的控件 和 自定义类的.m文件 进行连线 ● 5.提供一个类方法返回一个创建好的自定义view(屏蔽从xib加载的过程) ● 6.提供一个模型属性让外界传递