Enterprise Library 3.0 体验(2):使用Validation Application Block

摘要:在Enterprise Library 3.0 December 2006 CTP版中,加入了一个新的成员Validation Application Block,用来实现对业务对象的验证。它支持两种方式的验证,通过特性Attribute和通过配置文件,但是在最新版本中并没有提供配置的设计时支持,我们只能通过手动去修改配置文件来实现,所以本文主要看一下通过Attribute来实现验证。

 

主要内容

1.通过ValidationFactory创建验证器

2.通过外观类实现验证

 

一.概述

Enterprise Library 3.0 December 2006 CTP版中,加入了一个新的成员Validation Application Block,用来实现对业务对象的验证。它支持两种方式的验证,通过特性Attribute和通过配置文件,但是在最新版本中并没有提供配置的设计时支持,我们只能通过手动去修改配置文件来实现,所以本文主要看一下通过Attribute来实现验证。

二.通过ValidationFactory创建验证器

Validation Application Block沿用了其他应用程序块的一贯做法,使用相同的操作模式,为我们提供了一个ValidationFactory的工厂,用来创建验证器。首先我们编写一个简单的业务对象类:

/// <summary>

/// http://terrylee.cnblogs.com

/// </summary>


public class User
{
    
private String _name;

    
private int _age;

    
public String Name
    
{
        
get return _name; }
        
set { _name = value; }
    }


    
public int Age
    
{
        
get return _age; }
        
set { _age = value; }
    }

}

这只是一个普通的业务实体类,现在我们要验证它的姓名属性不能为空,且长度在150之间,年龄字段在0200之间,加上如下Attribute

/// <summary>

/// http://terrylee.cnblogs.com

/// </summary>


public class User
{
    
private String _name;

    
private int _age;

    [NotNullValidator]
    [StringLengthValidator(
1,50)]
    
public String Name
    
{
        
get return _name; }
        
set { _name = value; }
    }


    [Int32RangeValidator(
0,200)]
    
public int Age
    
{
        
get return _age; }
        
set { _age = value; }
    }

}

Validation Application Block中,现在已经提供的验证器有:

l         AndCompositeValidator

l         Int32RangeValidator

l         NotNullValidator

l         NullValidator

l         OrCompositeValidator

l         RangeValidator

l         StringLengthValidator

l         ValidNumberValidator

l         ValueAccessValidator

现在就可以进行验证了,如下面的代码片断所示:

/// <summary>

/// http://terrylee.cnblogs.com

/// </summary>


class Program
{
    
static void Main(string[] args)
    
{
        User user 
= new User();

        user.Name 
= "TerryLee";

        user.Age 
= 60;

        IValidator
<User> userValidators = ValidationFactory.CreateValidator<User>();

        ValidationResults results 
= userValidators.Validate(user);

        Console.WriteLine(results.IsValid.ToString());

        Console.Read();
    }

}

首先使用ValidationFactory创建Validator,再调用ValidatorValidate方法进行验证,返回的结果ValidationResults是一个ValidationResult的集合,包含了错误信息,我们可以通过KeyMessage属性来显示错误信息,如下所示:

/// <summary>

/// http://terrylee.cnblogs.com

/// </summary>


class Program
{
    
static void Main(string[] args)
    
{
        User user 
= new User();

        user.Name 
= "TerryLee";

        user.Age 
= 210;

        IValidator
<User> userValidators = ValidationFactory.CreateValidator<User>();

        ValidationResults results 
= userValidators.Validate(user);

        
foreach (ValidationResult result in results)
        
{
            Console.WriteLine(String.Format(
"Key: {0},Message: {1}", result.Key.ToString(), result.Message));
        }


        Console.Read();
    }

}

三.通过外观类实现验证

用过Logging Application Block的朋友都知道,在Logging Application Block中为我们提供了一个Logger的外观类,简化了记录日志。同样在Validation Application Block中,为我们提供了一个Validation的外观类,不需要再使用ValidationFactory。如下面的代码片断所示:

/// <summary>

/// http://terrylee.cnblogs.com

/// </summary>


class Program
{
    
static void Main(string[] args)
    
{
        User user 
= new User();

        user.Name 
= "TerryLee";

        user.Age 
= 210;

        ValidationResults results 
= Validation.Validate<User>(user);

        
foreach (ValidationResult result in results)

        
{
            Console.WriteLine(String.Format(
"Key: {0},Message: {1}", result.Key.ToString(), result.Message));
        }


        Console.Read();
    }

}

可以看到,Validation Application Block沿用了Enterprise Library的一贯操作模式,使用起来也非常的简单。如果提供的验证器不能满足实际开发的需要,也可以很轻松的创建自定义的验证其。关于Validation Application Block就简单得介绍到这儿。

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

posted on 2006-12-25 23:28 TerryLee 阅读(12606) 评论(27)  编辑 收藏 所属分类: Enterprise Library

评论

#1楼  2006-12-26 08:27 兰亭      

谢谢   回复  引用  查看    

#2楼  2006-12-26 08:50 zhaosichao[匿名] [未注册用户]

我很早就想要这个功能了。谢谢   回复  引用    

#3楼  2006-12-26 09:16 阿不      

我想这应该是一个很好的功能,但是在日常的开发过程会被多少人使用还是未知数。毕竟很多人在设计类时,可能很少考虑到数据的验证这个层面上。就比如我吧,希望以后养成这种好习惯。:)   回复  引用  查看    

#4楼  2006-12-26 13:12 hedking [未注册用户]

在这插句嘴

问个关于2.0的问题

我要想使用2.0中DAAB该把那几个DLL引用进来

看到有好多DLL文件,又去Google找过了,也没有个介绍


所以跑这里来问了   回复  引用    

#5楼  2006-12-26 13:50 行知      

很想知道,如果我们想在界面上的某一个输入框控件的校验中,绑定某个Validator该如何做?   回复  引用  查看    

#6楼  2006-12-27 11:19 Daniel Phang      

@hedking
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;   回复  引用  查看    

#7楼  2006-12-28 21:13 Tseng      

通常我们都会在客户端验证,MS这样弄,每次验证都要和SERVER交互,多浪费时间呀.   回复  引用  查看    

#8楼  2007-01-16 09:37 空空鱼      

@Tseng
客户端验证不能代替服务端验证   回复  引用  查看    

#9楼 [楼主] 2007-01-17 23:08 TerryLee      

@Tseng
空空鱼说的对,是两个不同层面的验证   回复  引用  查看    

#10楼  2007-01-21 17:07 Hunts.C      

IValidator<User> userValidators = ValidationFactory.CreateValidator<User>(); 刚才发现在V3.0 2007 CTP中将接口IValidator<T>改为了抽象类Validator<T>,包括Validator   回复  引用  查看    

#11楼  2007-01-29 08:13 TSENG      

@空空鱼
@TerryLee
是的,服务器验证可以避免一些漏洞,但是这样来回往返,效率上肯定没有客户端验证那么好。   回复  引用  查看    

#12楼  2007-02-09 09:39 一凡 [未注册用户]

楼主:在别的机器上运行就会出现这个错误: 打不开RSA密钥容器
为什么呀
  回复  引用    

#13楼  2008-04-06 09:43 阿捷      

楼主的文章写得通俗易懂,非常适合我这样的初学者,现在Enterprise Library已经发布2007 May版本,希望楼主可以针对最新的版本,继续发表文章,小弟们先拜谢了。   回复  引用  查看    

#14楼  2008-05-05 10:53 rakor [未注册用户]

我用vs2005进行开发,现在正在用EnterpriseLibrary2.0,请问有必要装换到EnterpriseLibrary3.0版吗?   回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
另存  打印
 


导航

公告

  • 网名:TerryLee
  • 本名:李会军
  • 位置:中国北京 Ethos
  • 联系方式:
  • 访问我的个人主页

 MVP配置

 版权声明

  • 本站采用创作共用许可 署名,非商业

绿色通道

IT新闻

统计

与我联系

留言簿(323)

我的标签

随笔分类

随笔档案

个人站点

关注项目

好的网站

我的好友