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 阅读(14419) 评论(29)  编辑 收藏 网摘 所属分类: [10]  模式与实践

  回复  引用  查看    
#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版吗?
  回复  引用    
#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




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 603518




相关文章:

相关链接: