Ariel Popovsky's Blog

Aventuras y desventuras con .net
posts - 9, comments - 146, trackbacks - 0

My Links

News

Locations of visitors to this page

Twitter












Tag Cloud

Archives

Post Categories

My Sites

Wednesday, April 29, 2009

Creando un Validador Personalizado para NHibernate Validator

NOTA (2009-06-26): Existe una librería oficial de NHibernate Validator con validadores adicionales específicos para ciertos paises, NHibernate.Validator.Specific.dll (descargar) y ya cuenta con un validador de CUIT. Gracias Fabio Maulo por el dato.


La aplicación en la que estoy trabajando está basada en ASP.net MVC y utilizamos Sharp Architecture como base. Sharp Architecture utiliza a su vez NHibernate Validator para la validación de las entidades de negocio por lo que, continuando con el tema del post anterior, decidí armar un validador de CUIT/CUIL personalizado y aplicarlo en nuestras clases.

Crear una validador para Nhibernate Validator es muy simple, solo se requieren dos clases simples, el validador propiamente dicho y un atributo. Empecemos por el atributo:

   1:  [Serializable, ValidatorClass(typeof(CuitValidator)), 
   2:      AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
   3:  public class CuitAttribute : Attribute, IRuleArgs
   4:  {
   5:      private string message;
   6:      
   7:      public CuitAttribute()
   8:      {
   9:          this.message = Glossary.Validation_Cuit_Invalid;
  10:      }
  11:      
  12:      public string Message
  13:      {
  14:          get { return message; }
  15:          set { message = value; }
  16:      }
  17:  }

 

Lo más importante es que debemos implementar la Intefaz “IRuleArgs” provista por el framework de validación (además de extender Attribute) y aplicar a su vez el atributo “ValidatorClass” el que indica cual es la clase concreta encargada de realizar la validación para los miembros que tengan este atributo.

La clase en cuestión es también muy simple, implementa la interfaz “IValidator”, cuyo único método es IsValid. Recibe el valor del miembro a validar y debe devolver True si es válido o False si no.

En mi implementación solo necesito llamar a la clase creada en el post anterior:

   1:  [Serializable]
   2:  public class CuitValidator:IValidator
   3:  {
   4:      public bool IsValid(object value)
   5:      {
   6:          return value == null || 
   7:                 value.ToString()==string.Empty || 
   8:                 CuitHelper.ValidaCuit(value.ToString());
   9:      }
  10:  }

Notese que si el valor es nulo o vacio lo damos por válido. Esto se debe a que para validar si un campo es requerido contamos con atributos más específicos (NotNull, NotNullOrEmpty).

Solo resta aplicarlo:

   1:          /// <summary> 
   2:          /// CUIT/CUIL de la persona Juridica. 
   3:          /// </summary> 
   4:          [Cuit]

 

Posted On Wednesday, April 29, 2009 10:58 PM | Feedback (1) | Filed Under [ NHibernate ]

Powered by: