一个自己编写的验证框架.

项目开发的时候.经常会遇到各种验证..例如密码是否正确,用户名重复验证之类的...  如果把这些代码都写在一起的话..那么就会形成下面的这个格式..

.....

我感觉这么写很正常的,对吧? 恩. 也可以把这些验证方法放在另一个地方.然后返回true/false什么的.  这样也能够体现分离.整洁啥的...

但是以后要在添加一个验证呢??  这样是不是就破坏了传说中的设计模式的开放/封装的原则?

所以根据各种原因我写了这么一个简单的框架..

开始进入正文:

  我先说使用方法...

  1. 第一步当然是引用程序集了...噗..

  2. 实现自己的验证器类. 实现Ivalidator接口. 并指定要验证的类型. 以及验证失败的时候返回的错误信息.

  3. 将自己的验证器类添加到Validators这个类中的AddValidator方法里面.并传入相应的参数(1. 验证的类型,2 自定义的验证器类实例)

  4. 在编写的程序中. 调用Validators类的Validate方法.

  5. 返回值:

    a) 如果所有验证器都通过验证.会返回null,这个时候你的程序就可以继续作别的..例如.将用户插入数据库..

    b) 如果有一个验证器没有通过. 则会返回验证器对应返回值. (ValidatorResult类型).. 这时你可以写一个全局的方法.然后传入这个类型.根据类型的值跳转,提示什么的.. 然后方法返回..

  6. 结束

  这个是测试方法...

 1   static void Main(string[] args)
 2         {
 3
 4             ///这个在全局的地方配置..可以添加多个类型
 5             Validators.AddValidators<int>(typeof(int), new ValidatorByInt1(), new ValidatorByInt2());
 6
 7             ///进行验证.
 8             int testValue = 1;
 9             ValidatorResult v = Validators.Validate<int>(testValue);
10             Console.WriteLine(" value:{0}; result:{1}", testValue, v == null ? "正确" : v.ErrorMsg);
11
12             testValue = 100;
13             v = Validators.Validate<int>(testValue);
14             Console.WriteLine(" value:{0}; result:{1}", testValue, v == null ? "正确" : v.ErrorMsg);
15
16
17             testValue = -1;
18             v = Validators.Validate<int>(testValue);
19             Console.WriteLine(" value:{0}; result:{1}", testValue, v == null ? "正确" : v.ErrorMsg);
20
21             Console.ReadKey();
22         }

Main函数.控制台测试程序

  这个是自己写的验证器类... 实现IValidator接口..

 1     public class ValidatorByInt1 : Validator<int>
 2     {
 3         public override ValidatorResult Validate(int model)
 4         {
 5             if (model > 10)
 6             {
 7                 return new ValidatorResult() { ErrorCode = 1, ErrorMsg = "必须小于10" };
 8             }
 9
10             return ValidatorResult.Success;
11         }
12     }
13
14
15     public class ValidatorByInt2 : Validator<int>
16     {
17         public override ValidatorResult Validate(int model)
18         {
19             if (model > 0)
20             {
21                 return ValidatorResult.Success;
22             }
23
24             return new ValidatorResult() { ErrorCode = 1, ErrorMsg = "必须大于0" };
25         }
26     }

自定义的验证器类.可以传入任何类型.

  以下是程序集的代码

1   /// <summary>
2     /// 验证器接口,提供验证的功能
3     /// </summary>
4     /// <typeparam name="T"></typeparam>
5     public interface IValidator<T>
6     {
7         ValidatorResult Validate(T model);
8     }

验证器接口: IValidator. 定义了Validate方法...

1     /// <summary>
2     /// 继承于验证器接口... 没有实现任何成员
3     /// 可添加成员
4     /// </summary>
5     /// <typeparam name="T"></typeparam>
6     public abstract partial class Validator<T> : IValidator<T>
7     {
8         public abstract ValidatorResult Validate(T model);
9     }

这个是实现IValidator接口的抽象类..没有任何实现0.0

 1     /// <summary>
 2     /// 验证结果..
 3     /// </summary>
 4     public class ValidatorResult
 5     {
 6         private int _ErrorCode = 0x0;
 7         private string _ErrorMsg = "";
 8
 9         /// <summary>
10         /// 表示验证成功.
11         /// </summary>
12         public static readonly ValidatorResult Success;
13
14         /// <summary>
15         /// 错误编号
16         /// </summary>
17         public virtual int ErrorCode
18         {
19             get { return _ErrorCode; }
20             set { _ErrorCode = value; }
21         }
22
23         /// <summary>
24         /// 错误信息
25         /// </summary>
26         public virtual string ErrorMsg
27         {
28             get { return _ErrorMsg; }
29             set { _ErrorMsg = value; }
30         }
31
32         public ValidatorResult()
33             //未知错误
34             : this(0x1, "未知错误")
35         { }
36
37         public ValidatorResult(int errorCode, string errorMsg)
38         {
39             this._ErrorCode = errorCode;
40             this._ErrorMsg = errorMsg;
41         }
42     }

这个是调用接口后返回值的类型.. 可以自定义其他类型. 因为属性可重写

  1     /// <summary>
  2     /// 验证器. 提供可以注册每个类型对应的验证器集合.以及验证每个验证器并返回验证器的结果.
  3     /// </summary>
  4     public class Validators
  5     {
  6         private static Dictionary<Type, Object> _AllValidator;
  7
  8         /// <summary>
  9         /// 保存所有的验证器
 10         /// </summary>
 11         private static Dictionary<Type, Object> AllValidator
 12         {
 13             get { return Validators._AllValidator ?? (Validators._AllValidator = new Dictionary<Type, object>()); }
 14         }
 15
 16         /// <summary>
 17         /// 给某个类型添加验证器.
 18         /// </summary>
 19         /// <typeparam name="T"></typeparam>
 20         /// <param name="type">类型</param>
 21         /// <param name="validators">验证器数组</param>
 22         public static void AddValidators<T>(Type type, params IValidator<T>[] validators)
 23         {
 24             if (AllValidator.Keys.Contains(type))
 25             {
 26                 AllValidator.Add(type, validators);
 27             }
 28             else
 29             {
 30                 AllValidator[type] = validators;
 31             }
 32
 33         }
 34
 35         /// <summary>
 36         /// 移除验证器.并返回其验证器
 37         /// </summary>
 38         /// <typeparam name="T"></typeparam>
 39         /// <param name="type">要移除的类型</param>
 40         /// <returns></returns>
 41         public static IValidator<T>[] RemoveValidators<T>(Type type)
 42         {
 43
 44             IValidator<T>[] value = default(IValidator<T>[]);
 45
 46             if (AllValidator.Keys.Contains(type))
 47             {
 48                 value = AllValidator[type] as IValidator<T>[];
 49
 50                 AllValidator.Remove(type);
 51             }
 52
 53             return value;
 54         }
 55
 56
 57         /// <summary>
 58         /// 根据类型.获取其所有的验证器
 59         /// </summary>
 60         /// <typeparam name="T"></typeparam>
 61         /// <param name="type">要获取验证器数组的类型</param>
 62         /// <returns></returns>
 63         public static IValidator<T>[] GetValidators<T>(Type type)
 64         {
 65             if (AllValidator.Keys.Contains(type))
 66             {
 67                 return AllValidator[type] as IValidator<T>[];
 68             }
 69             else
 70             {
 71                 return null;
 72             }
 73         }
 74
 75         /// <summary>
 76         /// 清空所有验证器
 77         /// </summary>
 78         public static void Clear()
 79         {
 80             _AllValidator = null;
 81         }
 82
 83
 84         /// <summary>
 85         /// 对模型进行多个验证
 86         /// </summary>
 87         /// <typeparam name="T">要验证的模型的类型</typeparam>
 88         /// <param name="model">要验证的模型</param>
 89         /// <param name="validators">验证集合...</param>
 90         /// <returns></returns>
 91         public static ValidatorResult Validate<T>(T model)
 92         {
 93             ///获取验证器数组
 94             IValidator<T>[] validators = Validators.GetValidators<T>(model.GetType());
 95
 96             ValidatorResult result = new ValidatorResult();
 97
 98             //个数为0或者全部通过验证的时候
 99             if (validators.Length == 0 || validators.All(validator => (result = validator.Validate(model)) == null))
100             {
101                 return ValidatorResult.Success;
102             }
103
104             return result;
105         }
106     }

这个是核心类了.. 这里面包含了能够定义全局验证器的方法和在程序中进行验证的方法.

以下是我认为这个框架的好处..

  这个框架将验证的过程单独提出来.封装成相关的类.  并在全局文件中进行注册.. 这样当程序调用的时候. 无论有多少个.. 都直接进行验证. 并返回验证的结果.. 这样以后添加验证的时候.直接写一个类并实现抽象类Validator的抽象方法. 以及返回相应的类型. 然后注册到全局文件中.. 这样就可以不用改方法的基础上.对程序进行扩展了.

虽然不是很流弊,但是我感觉用起来的话. 还是比较方便的. 对开发.

哪里写的不好.还请多批评啊.. 吸取经验. 3Q.

最后附上源文 件: [ 点啊点.点啊点 ]

时间: 2024-09-29 11:57:52

一个自己编写的验证框架.的相关文章

ASP.NET MVC验证框架中关于属性标记的通用扩展方法

http://www.cnblogs.com/wlb/archive/2009/12/01/1614209.html 之前写过一篇文章<ASP.NET MVC中的验证>,唯一的遗憾就是在使用Data Annotation Validators方式验证的时候,如果数据库是Entityframework等自动生成的文件,就没有办法使用扩展属性标记进行标记.现在已经开始有了一些其它的Asp.net MVC 验证框架,使用上跟Data Annotation Validators差不太多,但是普遍有这样

Struts2验证框架的注意事项

在编写struts2 的验证框架的时候 需要注意几点 1.编写的验证框架的配置文件要和被验证的Action的名称有一定的联系 age:Acton的名称:LoginUserAction  配置文件名:LoignUserAction-validation.xml 当Action里面得方法不止一个的时候 并且其他的方法不需要验证的时候 此时配置文件名为:LoginUserAction-mthodName-validation.xml    age(LoginUserAction-add-validat

简单的js表单验证框架

/** * 通常在我们的HTML页面表单中有大量的数据验证工作, * 免不了要写很多验证表单的js代码,这是一项非常繁琐 * 枯燥的工作.很多程序员也会经常遗漏这项工作.当然 * 一些JavaEE框架中有一些比较好的验证框架提供给我们 * 使用,但是也是需要很多繁琐的配置,页面查看起来也 * 不是很方便.一般程序员使用的也不多.所以写了这一 * 段JavaScript代码提供给大家使用.算是一个简单的 * JavaScript验证框架吧.使用起来很简单,配合下面几 * 种标签使用,能实现大多数表

如何编写一个企业级Hyperledger Fabric开源框架

Convector(a.k.a Convector Smart Contracts)是为企业区块链框架构建的JavaScript开发框架.它增强了开发体验,同时帮助开发人员创建更强大,更安全的智能合约系统.它通过链代码和后端一直到前端,允许开发人员以库的形式重用相同的代码库.它基于模型/控制器模式,支持Hyperledger Fabric,并沿着Fabric精心设计的模式本地运行. 这篇博客文章介绍了该项目的历史,并重点介绍了沿途开发的挑战和解决方案. 当我们开始研究Tellus时,一切都开始了

基于OpenGL编写一个简易的2D渲染框架-05 渲染文本

阅读文章前需要了解的知识:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 简要步骤: 获取要绘制的字符的 Unicode 码,使用 FreeType 库获取对应的位图数据,添加到字符表中(后面同样的字符可以再表中直接索引),将字符表上的字符填充到一张纹理上.计算每个字符的纹理坐标,使用渲染器绘制 注意的问题: 对于中英文混合的字符串,使用 char 存储时,英文字符占 1 个字节,而中

struts2学习笔记(三)—— 在用户注冊程序中使用验证框架

实现目标: 1.使用验证框架对用户注冊信息进行验证 2.验证username.password.邮箱不能为空 3.验证username.password长度 4.验证邮件地址格式 详细实现 一.Struts2应用的基础配置 这里不做具体阐述,具体为web.xml.相关jar包的配置 二.将页面显示的文本内容放到资源文件里 1.查看用户注冊程序中的全部页面,找到全部能够显示的文本内容,将它们分离出来放到资源文件里. 2.与相关的Action类同名,以.preperties为扩展名,与Action类

记2014年暑假,一个项目,三个框架

在开始动笔之际,看了下博文的标题,突然觉得欠妥,"记2014年暑假,一个项目,三个框架",既然是暑假说明还是学生,今年的6月我已经毕业了,但还在学习,并且在向一名合格的架构师狂奔.你说我矫情也好,做作也罢,现实就是这样的,厚着脸说:咱也矫情一回. 整个暑假,总共四十天,从7月中旬开始到8月底,从技术上看,整个假期都处于看视频,做项目,作总结的过程中,前二十天跟着视频做了DRP的项目,后二十天(到8月26日),看完了三个框架的视频,总结还在继续:从英语上看,这个假期是从听走向说的开始:从

struts2学习笔记(三)—— 在用户注册程序中使用验证框架

实现目标: 1.使用验证框架对用户注册信息进行验证 2.验证用户名.密码.邮箱不能为空 3.验证用户名.密码长度 4.验证邮件地址格式 具体实现 一.Struts2应用的基础配置 这里不做详细阐述,具体为web.xml.相关jar包的配置 二.将页面显示的文本内容放到资源文件中 1.查看用户注册程序中的所有页面,找到所有可以显示的文本内容,将它们分离出来放到资源文件中. 2.与相关的Action类同名,以.preperties为扩展名,与Action类位于同一个包中,只能由该Action访问 R

Jodd-vtor验证框架

VTor是一个编程式验证框架,适用于任意java对象的验证.它是一个快速.微型的.专注于验证的框架.也可以通过注解或者手动设置验证条件.验证条件也可以在profile中分组.VTor是可扩展的,用户很容易使用自定义的验证条件.默认情况下,验证条件以java编写,但也很容易扩展它,使用xml或者其它编程语言来定义验证表达式. Validation in action VTor的验证过程包括: 定义校验检查(如应用的验证条件). 在目标对象(通常指java bean对象)执行这些规则. 检查验证结果