viernes, 27 de julio de 2007

¿Cómo crear un Custom Validator para VAB de EntLib 3.1?

Introducción Ya vimos como se utiliza el VAP de EntLib 3.1, más adelante vamos a ver la integración con Winforms y ASP.NET (dos cosas muy interesantes) pero ahora es momento de aprender a crear nuestros propios validadores. Esto es muy útil para realizar validaciones que no se pueden con los elementos que trae VAP por defecto, en este caso vamos a ver un ejemplo de cómo realizar la validación de un número de CUIT/ CUIL de Argentina. Teoría Para poder crear nuestros Validators y que EntLib los acepte son necesarias dos cosas.
  • Que nuestra clase herede de Validator
  • Que nuestra clase esté adornado con el atributo CustomValidatorData
Con esto es suficiente, obviamente al heredar de Validator (que es una clase abstracta) tenemos que implementar dos métodos
  • DoValidate
  • DefaultMessageTemplate
Pero, alto, hace falta algo más que no es tan fácil de deducir, nuestra clase tiene que tener un constructor que acepte un parámetro del tipo NameValueCollection esto es para que EntLib le pase los atributos de la configuración, pero repito, no lo dice por ningún lado así que cuidado porque sino nos va a dar un error al querer realizar la validación no antes. Veamos el código.
   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Text;
   4:  using System.Configuration;
   5:  using Microsoft.Practices.EnterpriseLibrary.Validation;
   6:  using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
   7:  using System.Collections.Specialized;
   8:   
   9:  namespace Validadores
  10:  {
  11:      [ConfigurationElementType(typeof(Microsoft.Practices.EnterpriseLibrary.Validation.Configuration.CustomValidatorData))]
  12:      public class CuitValidator: Validator
  13:      {
  14:          public CuitValidator():base(null,null) { }
  15:          public CuitValidator(NameValueCollection values): base(null,null)
  16:          {
  17:          }
  18:          protected override string DefaultMessageTemplate
  19:          {
  20:              get { return "El CUIT ingresado no es válido"; }
  21:          }
  22:   
  23:          protected override void DoValidate(object objectToValidate, object currentTarget, string key, ValidationResults validationResults)
  24:          {
  25:              if (objectToValidate != null)
  26:              {
  27:                  bool valido = CUIT.Validar((string)objectToValidate);
  28:                  if(!valido)
  29:                      base.LogValidationResult(validationResults, this.DefaultMessageTemplate, currentTarget, key);
  30:              }
  31:          }
  32:      }
  33:  }
con esto es suficiente, el método DefaultMessageTemplate permite recuperar el mensaje de error por defecto, el método DoValidate realiza la validación, como se puede ver tenemos una clase CUIT con un método estático Validar que utilizamos para validar y es todo, si la validación es incorrecta llamamos a base.LogValidationResult que agrega nuestro mensaje a ValidationResults la colección que contendrá los errores en la validación, no es necesario hacer nada más que esto para poder utilizar nuestro validador configurando el application block desde el archivo de configuración, ahora, si queremos poder agregar como atributo en alguna propiedad nuestro validador hay que hacer trabajo adicional, pero no se asusten, es simple. Validar con atributos
   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Text;
   4:  using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
   5:   
   6:  namespace Validadores
   7:  {
   8:      public class CuitValidatorAttribute: ValidatorAttribute
   9:      {
  10:          protected override Microsoft.Practices.EnterpriseLibrary.Validation.Validator DoCreateValidator(Type targetType)
  11:          {
  12:              return new CuitValidator();
  13:          }
  14:      }
  15:  }
sencillo, sólo hay que heredar la clase abstracta ValidatorAttribute que tiene un sólo método, y lo que tenemos que hacer es retornar una instacia de nuestro validador y listo. Namespace utilizados: System.Configuration; Microsoft.Practices.EnterpriseLibrary.Validation; Microsoft.Practices.EnterpriseLibrary.Common.Configuration; System.Collections.Specialized; Microsoft.Practices.EnterpriseLibrary.Validation.Validators; PD: El código para realizar la validación se los dejo de tarea :) .