1 在业务对象上添加验证
添加对程序集【Microsoft.Practices.EnterpriseLibrary.Validation.dll】和【System.ComponentModel.DataAnnotations】的引用。
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
定义下面的对象
代码
public class Customer
{
[StringLengthValidator(1, 25)]
public string FirstName { get; set; }
[StringLengthValidator(1, 25)]
public string LastName { get; set; }
[RegexValidator(@"^\d\d\d-\d\d-\d\d\d\d$")]
public string SSN { get; set; }
public Address Address { get; set; }
}
public class Address
{
[StringLengthValidator(1, 50)]
public string StreetAddress { get; set; }
[ValidatorComposition(CompositionType.And)]
[StringLengthValidator(1, 50)]
[ContainsCharactersValidator("sea", ContainsCharacters.All)]
public string City { get; set; }
[StringLengthValidator(2, 2)]
public string State { get; set; }
[RegexValidator(@"^\d{5}$")]
public string ZipCode { get; set; }
}
{
[StringLengthValidator(1, 25)]
public string FirstName { get; set; }
[StringLengthValidator(1, 25)]
public string LastName { get; set; }
[RegexValidator(@"^\d\d\d-\d\d-\d\d\d\d$")]
public string SSN { get; set; }
public Address Address { get; set; }
}
public class Address
{
[StringLengthValidator(1, 50)]
public string StreetAddress { get; set; }
[ValidatorComposition(CompositionType.And)]
[StringLengthValidator(1, 50)]
[ContainsCharactersValidator("sea", ContainsCharacters.All)]
public string City { get; set; }
[StringLengthValidator(2, 2)]
public string State { get; set; }
[RegexValidator(@"^\d{5}$")]
public string ZipCode { get; set; }
}
2 对业务对象进行验证
添加对
Microsoft.Practices.EnterpriseLibrary.Validation.dll
Microsoft.Practices.ServiceLocation.dll
Microsoft.Practices.EnterpriseLibrary.Common.dll
的引用。
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Entity;
namespace AOPValidation.ConApp
{
class Program
{
static void Main(string[] args)
{
Validator<Customer> customerValidator = null;
ValidatorFactory validatorFactory = EnterpriseLibraryContainer.Current.GetInstance<ValidatorFactory>();
customerValidator = validatorFactory.CreateValidator<Customer>();
Customer customer = new Customer()
{
FirstName = "1231231233333333333333333333333333333333333333",
LastName = "2342424234",
SSN = "sdfsd",
Address = new Address()
{
City = "sdf",
State = "dsf",
StreetAddress = "sdfsdf",
ZipCode = "sd"
}
};
ValidationResults validationResults= customerValidator.Validate(customer);
if (!validationResults.IsValid)
{
Console.WriteLine("customer is invalid");
StringBuilder sb = new StringBuilder(0);
foreach (ValidationResult result in validationResults)
{
sb.AppendLine(string.Format(CultureInfo.CurrentCulture, "{0}:{1}",
result.Key, result.Message));
}
Console.WriteLine(sb.ToString());
}
else
{
Console.WriteLine("customer is valid");
}
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Entity;
namespace AOPValidation.ConApp
{
class Program
{
static void Main(string[] args)
{
Validator<Customer> customerValidator = null;
ValidatorFactory validatorFactory = EnterpriseLibraryContainer.Current.GetInstance<ValidatorFactory>();
customerValidator = validatorFactory.CreateValidator<Customer>();
Customer customer = new Customer()
{
FirstName = "1231231233333333333333333333333333333333333333",
LastName = "2342424234",
SSN = "sdfsd",
Address = new Address()
{
City = "sdf",
State = "dsf",
StreetAddress = "sdfsdf",
ZipCode = "sd"
}
};
ValidationResults validationResults= customerValidator.Validate(customer);
if (!validationResults.IsValid)
{
Console.WriteLine("customer is invalid");
StringBuilder sb = new StringBuilder(0);
foreach (ValidationResult result in validationResults)
{
sb.AppendLine(string.Format(CultureInfo.CurrentCulture, "{0}:{1}",
result.Key, result.Message));
}
Console.WriteLine(sb.ToString());
}
else
{
Console.WriteLine("customer is valid");
}
Console.ReadLine();
}
}
}
验证的结果显示如下
你会发现只是验证了Customer对象的属性,Address上面也添加了验证attribute,可是没有起到效果。对象里面的属性经常会是另外一个对象的,难道要将对象的所有对象属性都定义一个validator,然后validate一下吗,好像有点麻烦, 有没有解决办法呢?
有的,只要在Customer的Address属性上面添加一个attribute,【 ObjectValidator】,是的Customer变为下面的形式即可。
代码
public class Customer
{
[StringLengthValidator(1, 25)]
public string FirstName { get; set; }
[StringLengthValidator(1, 25)]
public string LastName { get; set; }
[RegexValidator(@"^\d\d\d-\d\d-\d\d\d\d$")]
public string SSN { get; set; }
[ObjectValidator]
public Address Address { get; set; }
}
{
[StringLengthValidator(1, 25)]
public string FirstName { get; set; }
[StringLengthValidator(1, 25)]
public string LastName { get; set; }
[RegexValidator(@"^\d\d\d-\d\d-\d\d\d\d$")]
public string SSN { get; set; }
[ObjectValidator]
public Address Address { get; set; }
}
这时候再次运行程序,发现Address的属性也被验证了。
3 使用配置实现验证
添加需要验证的类,然后为每个类添加验证规则之后,按照上面的图示进行配置(上面只添加了一个类Customer,如果需要用配置验证Address,需要再添加一个Validated Type),去掉业务类上的attribute,再次运行程序。具体的配置步骤和其他模块的配置类似,也可以参考:Microsoft Enterprise Library 5.0 系列(三) Validation Application Block (高级) 。
就会看到下面的结果,配置的验证规则产生了效果,和在对象的属性上添加attribute是一样的效果。
通过代码和配置都可以在一个属性上面同时添加几个验证,例如:同时长度和内容。
[ValidatorComposition(CompositionType.And)]
[StringLengthValidator(1, 50)]
[ContainsCharactersValidator("sea", ContainsCharacters.All)]
public string City { get; set; }
[StringLengthValidator(1, 50)]
[ContainsCharactersValidator("sea", ContainsCharacters.All)]
public string City { get; set; }