Thursday, April 1, 2010

Validação de Entidades usando Microsoft Validation Application Block

Existe uma forma interessante de validar objetos utilizando o Microsoft Validation Application Block.

http://msdn.microsoft.com/en-us/library/cc511802.aspx

Dessa forma, ao invés de validar os objetos dentro das propriedades ou métodos, esses campos podem ser validados
através de Decorators.( [ ] )

Exemplo: ( tirado de http://msdn.microsoft.com/en-us/library/cc511619.aspx )

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

public class Customer
{
 private string firstName;
 private string lastName;
 private DateTime dateOfBirth;
 private string email;
 private Address address;

 [StringLengthValidator(1, 50, Ruleset="RuleSetA",
              MessageTemplate="First Name must be between 1 and 50 characters")]
 public string FirstName
 {
   get { return firstName; }
   set { firstName = value; }
 }

 [StringLengthValidator(1, 50, Ruleset = "RuleSetA", 
              MessageTemplate = "Last Name must be between 1 and 50 characters")]
 public string LastName
 {
   get { return lastName; }
   set { lastName = value; }
 }

 [RelativeDateTimeValidator(-120, DateTimeUnit.Year, -18, 
                  DateTimeUnit.Year, Ruleset="RuleSetA", 
                  MessageTemplate="Must be 18 years or older.")]
 public DateTime DateOfBirth
 {
   get { return dateOfBirth; }
   set { dateOfBirth = value; }
 }

 [RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", 
                Ruleset = "RuleSetA")]
 public string Email
 {
   get { return email; }
   set { email = value; }
 }

 [ObjectValidator("ValidAddress", Ruleset="RuleSetA")]
 public Address Address
 {
   get { return address; }
   set { address = value; }
 }

 [RangeValidator(0, RangeBoundaryType.Inclusive, 1000000, 
       RangeBoundaryType.Inclusive, Ruleset="RuleSetA", 
       MessageTemplate="Rewards points cannot exceed 1,000,000") 
 public int RewardPoints
 {
   get { return rewardPoints; }
   set { rewardPoints = value; }
 }

}

Depois o Customer pode ser validado de uma vez só da seguinte forma:

Exemplo: ( http://msdn.microsoft.com/en-us/library/cc511605.aspx )

Customer cust = new Customer();
ValidationResults results = Validation.Validate(cust, customerRuleSetCombo.Text);

Os objetos também podem implementar um método que faz todas as validações de uma só vez.

Exemplo: ( http://msdn.microsoft.com/en-us/library/cc511640.aspx )

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

[HasSelfValidation]
public class TemperatureRange
{
 private int min;
 private int max;

 // ...

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

É importante notar que o Validation Application Block pode ser usado em aplicações ASP.NET, Winforms e WCF. ( http://msdn.microsoft.com/en-us/library/cc511714.aspx )

* Integrando Validations no Winforms: http://msdn.microsoft.com/en-us/library/cc511884.aspx

* Integrando Validations em ASP.NET: http://msdn.microsoft.com/en-us/library/cc511745.aspx

* Integranto Validations no WCF: http://msdn.microsoft.com/en-us/library/cc511692.aspx

No comments:

Post a Comment