jueves, 19 de julio de 2007

Introducción al Validation Application Block

Introducción Para los que no lo conocen el Validation Application Block es parte de la Enterprise Library desde hace tiempo, si bien, creo que ahora con la 3.1 con los adaptadores para winforms, asp.net y wcf se puede decir que está "completo", pero eso lo vamos a ver más adelante, comencemos por el principio. Proceso de validación Pocas cosas son más molestas que las validaciones (y trabajosas) sobre todo porque enmarañan el código y si no están correctas cambiarlas suele ser un problema. Bien el VAB (validation app block) viene en nuestra ayuda. VAP nos va a permitir escribir un pequeño código para realizar el proceso de validación y, en todo caso dejar para más tarde las validaciones, o al menos, que se encuentren en un lugar qu las haga flexible. Veamos un ejemplo. Ejemplo 1
   1:  public class Persona
   2:  {
   3:      private int _edad;
   4:      private string _nombre;
   5:      private string _apellido;
   6:      private string _email;
   7:   
   8:      public string Email
   9:      {
  10:          get { return _email; }
  11:          set { _email = value; }
  12:      }
  13:      public string Apellido
  14:      {
  15:          get { return _apellido; }
  16:          set { _apellido = value; }
  17:      }
  18:      public string Nombre
  19:      {
  20:          get { return _nombre; }
  21:          set { _nombre = value; }
  22:      }
  23:      public int Edad
  24:      {
  25:          get { return _edad; }
  26:          set { _edad = value; }
  27:      }
  28:  }
Ok, supongan que queremos validar lo siguiente:

  • Que el nombre no sea nulo
  • Que tenga entre 4 y 20 caracteres
  • El apellido igual
  • La edad que sea mayor de 18
  • Y el mail correctamente formado

Si, no es muy difícil, pero lo hacemos con algunos método o qué se yo y después las reglas cambian, hay que buscar por todo el código, es más, si llegamos a utilizar esta entidad en varios proyectos (desde varios assembies quiero decir) se pone medio feo, porque tenemos que tener las reglas de validación públicas, en fin.

Cómo se hace con VAP, bueno hay tres modos, por atributos, por configuración o ambos.

Validacion por atributos

Existe una serie de atributos para realizar las validaciones con VAP se encuentran en Microsoft.Practices.EnterpriseLibrary.Validation.Validators, hay muchos (me da un poco de fiaca escribirlos) pero les aseguro que hay para todos los gusto, y es más, podemos escribir los propios, eso lo vamos a ver más adelante. Veamos como decoramos nuestra clase Persona con los atributos.

   1:          public class Persona
   2:          {
   3:              [RegexValidator(@"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$", MessageTemplate = "El email no es válido")]
   4:              public string Email
   5:              {
   6:                  get { return _email; }
   7:                  set { _email = value; }
   8:              }
   9:   
  10:              [NotNullValidator(MessageTemplate = "El apellido no puedo estar vacío")]
  11:              [StringLengthValidator(4, 20, MessageTemplate = "El largo del mensaje debe estar en 4 y 20 caracteres")]
  12:              public string Apellido
  13:              {
  14:                  get { return _apellido; }
  15:                  set { _apellido = value; }
  16:              }
  17:   
  18:              [NotNullValidator(MessageTemplate = "El nombre no puedo estar vacío")]
  19:              [StringLengthValidator(4, 20, MessageTemplate = "El largo del mensaje debe estar en 4 y 20 caracteres")]
  20:              public string Nombre
  21:              {
  22:                  get { return _nombre; }
  23:                  set { _nombre = value; }
  24:              }
  25:   
  26:              [RangeValidator(18, RangeBoundaryType.Inclusive, 90, RangeBoundaryType.Inclusive)]
  27:              public int Edad
  28:              {
  29:                  get { return _edad; }
  30:                  set { _edad = value; }
  31:              }
  32:          }
  33:          public void Validar()
  34:          {
  35:              ValidationResults results = ValidationFactory.CreateValidator().Validate(p);
  36:              if (!results.IsValid)
  37:              {
  38:                  StringBuilder sb = new StringBuilder("Errores de validación");
  39:                  sb.AppendLine();
  40:   
  41:                  foreach (ValidationResult result in results)
  42:                  {
  43:                      sb.AppendLine(result.Message);
  44:                  }
  45:                  Console.WriteLine(sb.ToString());
  46:              }
  47:              else
  48:              {
  49:                  Console.WriteLine("todo bien");
  50:              }
  51:   
  52:          }

Listo, si lo corremos vemos que funciona de maravillas, una belleza. Pero esperen, no me digan "tengo que poner el código en el programa igual", esto es cierto, si bien ahora las validaciones son propias de la clase, no andan desperdigadas por ahí, pero esto no es lo mejor, lo mejor es que podemos prescindir de escribir ni un sólo atributo en las clases y poner las reglas de validación en el archivo de configuración de la aplicación. Pero eso lo vemos mañana, hasta entonces.

1 comentario:

Ernesto dijo...

Estoy trabajando en un proyecto utilizando asp.net ajax framework 3.5
using ...validation.validators;

[NotNullValidator]
....
[RegexValidator(@"\(\d{3}\) \d{3}-\d{4}")]
....
private int _edad;
[Int32RangeValidator(23,50)]
public int Edad
{
get { return _edad; }
set { _edad = value; }
}

Me marca error en Int32RangeValidator, me dice que falta un using o una referencia.
He observado en el explorador de objetos y no me aparece el atributo Int32RangeValidator,
He probado con todas las versiones de Enterprise Library 3.0 2006, 3.0 2007, 3.1, 4.1 y en ninguna de las versiones me aparece dicho atributo.

Ojala me puedas apoyar mi correo es vallejosantes@gmail.com