65.9K
CodeProject 正在变化。 阅读更多。
Home

验证应用程序块入门

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (10投票s)

2007年2月2日

CPOL

7分钟阅读

viewsIcon

76104

验证应用程序块已添加到企业库 2007 CTP 版本中。

验证应用程序块已添加到企业库 2007 CTP 版本中。您可以在此处下载。

引言

任何需要从用户或其他系统获取输入的应用程序都必须确保信息符合特定规则的正确格式。例如,注册表单中有许多字段,如社会安全号码、信用卡号、电子邮件等,在插入数据库之前需要进行特定格式验证。此外,如果验证失败,通常会发送一条错误消息来解释问题所在。

企业库验证应用程序块提供了一系列类,称为验证器,它们提供了验证 .NET Framework 数据类型的代码。例如,一个验证器检查 string 是否不为 null,另一个验证器确保数字在指定范围内。您可以使用布尔 ANDOR 来创建复合验证器。您还可以创建验证器组。验证器组称为规则集,尽管规则集可以只包含一个验证器。规则集是一种通过组合不同类型的验证器并将它们应用于对象图中的元素来验证复杂对象或图的方法。这些元素的示例包括字段、属性和嵌套对象。

验证应用程序块包含适配器,允许您将应用程序块与以下技术一起使用:

  • ASP.NET
  • Windows Forms
  • AJAX
  • Windows Communication Foundation (WCF)
  • Windows Presentation Foundation (WPF)

要获取更详细的信息,请查阅随此版本附带的验证应用程序块文档。

如何在您的应用程序中使用验证应用程序块

通过 Enterprise Library Configuration tools 打开应用程序配置文件 app.configweb.config

按照以下步骤添加验证应用程序块:

  1. 启动 Enterprise Library Configuration Console。要使用配置控制台,请单击 **开始**,指向 **所有程序**,指向 **Microsoft patterns & practices**,指向 **Enterprise Library 3.0 – January 2007 CTP**,然后单击 Enterprise Library Configuration。
  2. 单击 **打开现有应用程序** 图标,并找到您的 config 文件... 通过 Enterprise Library Configuration tools 打开应用程序配置文件 app.configweb.config

右键单击 **Application Configuration**,指向 **New**,然后单击 **Validation Application Block**。

Enlib1.JPG

在类型级别应用验证器

以下过程显示了如何在类型级别应用验证器。

在类型级别应用验证器

  1. 右键单击 **Validation Application Block**,指向 New,然后单击 **Type**。

    Enlib2.JPG

  2. 此时将打开 **Type Selector — System.Object** 对话框。
  3. 双击您要使用的程序集。如果程序集不在对话框中,请单击 **Load Assembly** 并导航到它。

    Enlib3.JPG

  4. 双击您要验证的类型。
  5. (可选) 如果有一个现有的规则集是您想指定的默认规则集,请在右侧窗格中单击 **DefaultRule** 并从下拉框中选择它。
  6. 要定义一个规则集,请右键单击类型节点,指向 **New**,然后单击 **Rule Set**。
  7. 右键单击 **Self**,指向 **New**,然后单击您要使用的验证器。通常是 **Custom Validator** 或 **Not Null Validator**。

    为特定类型定义规则集

    以下过程显示了如何为特定类型定义规则集。请注意,一个对象可以有多个关联的规则集。

    为特定类型定义规则集

  8. 右键单击 **Validation Application Block**,指向 **New**,然后单击 **Type**。
  9. 此时将打开 **Type Selector — System.Object** 对话框。
  10. 双击您要使用的程序集。如果程序集不在对话框中,请单击 **Load Assembly** 并导航到它。
  11. 双击您要验证的类型。
  12. (可选) 如果有一个现有的规则集是您想指定的默认规则集,请在右侧窗格中单击 **DefaultRule** 并从下拉框中选择它。
  13. 要定义一个规则集,请右键单击类型节点,指向 **New**,然后单击 **Rule Set**。请注意,规则集可以只包含一个验证器。
  14. (可选) 在右侧窗格中输入规则集的名称。
  15. 要选择要验证的内容,请右键单击 **Rule Set**,指向 **New**,然后选择 **Field**、**Method** 或 **Property**。

    Enlib4.JPG

  16. (可选) 在右侧窗格中输入字段、方法或属性的名称。
  17. 右键单击字段、方法或属性,然后选择您要应用给它的验证器。
  18. (可选) 填写 **Tag**、**MessageTemplate** 和 **MessageTemplateResource** 字段(如果适用)。您可以输入 **MessageTemplateResourceTypeName** 字段,或者单击省略号并使用 **Type Selector — System.Object** 对话框进行选择。许多验证器也有特定于它们的字段。也请填写这些字段。
  19. 对于添加的每个验证器,重复步骤 10 和 11。在类型成员上应用验证器。以下过程解释了如何将验证器应用于类型成员。类型成员包括属性、方法和字段。

    Enlib5.JPG

    在类型成员上应用验证器

  20. 右键单击 Validation Application Block,指向 **New**,然后单击 **Type**。
  21. 此时将打开 Type Selector — System.Object 对话框。
  22. 双击您要使用的程序集。如果程序集不在对话框中,请单击 **Load Assembly** 并导航到它。
  23. 双击您要验证的类型。
  24. (可选) 如果有一个现有的规则集是您想指定的默认规则集,请在右侧窗格中单击 **DefaultRule** 并从下拉框中选择它。
  25. 要定义一个规则集,请右键单击类型节点,指向 **New**,然后单击 **Rule Set**。
  26. (可选) 在右侧窗格中输入规则集的名称。
  27. 右键单击 Rule Set,指向 **New**,然后选择 **Choose Members**。
  28. 此时将出现 Member Selector 对话框。
  29. 单击 Properties、Methods 和/或 Fields(根据您要验证的内容)。这将选择所有条目。
  30. 取消选择您不想验证的属性、方法和/或字段。单击 OK。所需的验证器将显示在配置层次结构中。
  31. 右键单击字段、方法或属性,然后选择您要应用给它的验证器。
  32. 对于每个验证器,填写 **Tag**、**MessageTemplate** 和 **MessageTemplateResource** 字段(如果适用)。您可以输入 MessageTemplateResourceTypeName 字段,或者单击省略号并使用 **Type Selector — System.Object** 对话框进行选择。许多验证器也有特定于它们的字段。也请填写这些字段。
  33. 对于添加的每个成员和验证器,重复步骤 10 到 14。

    Enlib6.JPG

定义复合验证器

以下过程解释了如何定义复合验证器。复合验证器由单独的验证器构建而成,这些验证器通过布尔 ANDOR 组合。

定义复合验证器

  1. 右键单击您要验证的类型或类型成员。
  2. 选择 AndCompositeValidator OrCompositeValidator
  3. 右键单击 AndCompositeValidator OrCompositeValidator,然后选择将构成复合验证器的其中一个验证器。填写右侧窗格中的字段。对于添加的每个验证器,重复此步骤。

在发布文档中查看更多内容。

现在让我们来看一些简单的代码。

using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

namespace ValidationApplicationBlock
{
    public class StringValidator
    {
        /// <summary>
        /// Constructor
        /// </summary>
        public StringValidator()
        {
        }
        /// <summary>
        /// Validation 
        /// </summary>
        [NotNullValidator]    
        [StringLengthValidator(1, 50)]    
        public string Name;    
        
    }
}

StringValidator oStringValidator = new StringValidator();
oStringValidator.Name = txtName.Text; //get the value from use
 
ValidationResults r = Validation.Validate(oStringValidator);
if (!r.IsValid)
   {
    errorProvider1.SetError(txtEmail, 
	"Input Not Vail"); //showing error description using error provider
   }

非常酷,而且简单。

使用验证外观

在大多数情况下,您可以利用 Validation façade。这个类允许您创建 Validatorinstance 并用一行代码验证对象。下面的代码示例显示了这一点。

Customer myCustomer = new Customer( /* ... */ );
ValidationResults r = Validation.Validate(myCustomer);

此代码等效于以下代码示例:

Customer myCustomer = new Customer( /* ... */ );
Validator<customer> v = ValidationFactory.CreateValidator<customer>();
ValidationResults r = v.Validate(myCustomer);

您可以在此处找到更多关于 Façade 模式的详细信息。

使用自验证

[HasSelfValidation]
public class MaXMin
{ 
    private int min; 
    private int max;
 
    // ...

    [SelfValidation]             
    public void Check (ValidationResults results) 
    { 
         if (max < min) 
           results.AddResult(new ValidationResult
		("Max less than min", this, null, null, null));
    } 
}

规则集

有时,您只需要关注某些特定的属性,然后创建一个区分 null 规则和其他规则的规则集。这可以通过使用 Validation.Validate(subscriber, "UserInfo"); 来检查。

public class UserInfo
{
    private string name;

    [NotNullValidator(Ruleset="UserInfo")]
    [StringLengthValidator(1,200)]
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private string emailAddress;

    [NotNullValidator(Ruleset="UserInfo")]
    [EmailAddressValidator]
    public string EmailAddress
    {
        get { return emailAddress; }
        set { emailAddress = value; }
    }

    public UserInfo () {}
}

结论

我希望这能让您对这个块将带来什么有所了解。微软将如何设计这个块以适应 Ajax 和 WCF 的情况尚未完全确定。我在一些博客上找到了有关此问题的信息。让我们看看它将如何实现……希望这个块能像数据访问应用程序块一样被广泛使用。

有关验证应用程序块的相关博客可以在这里这里找到。

历史

  • 2007 年 2 月 2 日:首次发布
© . All rights reserved.