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 @ 2006-12-25 23:28 TerryLee 阅读(15718) 评论(29) 编辑 收藏

 回复 引用 查看   
#1楼 2006-12-26 08:27 兰亭      
谢谢
我很早就想要这个功能了。谢谢
 回复 引用 查看   
#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版吗?
 回复 引用   
#15楼 2009-03-10 13:43 fengzhen[未注册用户]
请问
都引用了哪些.dll?

 回复 引用   
#16楼 2009-03-10 13:48 fengzhen[未注册用户]
vl AndCompositeValidator

l Int32RangeValidator

l NotNullValidator

l NullValidator

l OrCompositeValidator

l RangeValidator

l StringLengthValidator

l ValidNumberValidator

l ValueAccessValidator

这几个我只找到了其中几个可用的
引用了Microsoft.Practices.EnterpriseLibrary.Validation.dll程序集

其它几个该引用哪个或哪些.dll程序集?
Thanks