NHibernate Validator en Winforms
Debido a que NHibernate.Validator es un framework para validar objetos, y no tiene restricciones acerca de donde realizar la validación, pensé que podrÃa ser interesante tener algún tipo de integración con Winforms o Asp.Net. Por ahora me inclino hacia el lado de Winforms donde estoy más cómodo programando.
El siguiente ejemplo intenta validar un simple formulario con un par de cajas de texto:
Ahora bien, como fue validado esto? Usando NHibernate.Validator y unas clases ayudantes que se encuentran en Suricato.Winforms.Validation. La clase ViewValidator es la encarga de realizar los enlaces de los controles con las reglas. Esta es la configuración:
Como pueden ver, ViewValidator recibe el ErrorProvider que mostrará los controles que poseen inconsistencia en sus valores. Prácticamente lo que se hacer es enlazar un control de la UI con ciertas reglas que le corresponden a propiedades de un objeto. Por ejemplo el TextBox “tFirstName” se corresponde con las reglas de validación de la property “FirstName” en la clase Customer. Seguidamente se añade el evento que debe realizar la validación del control.
Esto se podrÃa realizar de una manera más fácil? Si, con un esquema similar la clase SmartViewValidator realiza el enlace de los objetos y el registro de los eventos de manera más automática.
SmartViewValidator hará por nosotros algunas cosas automáticamente. Con un poco de menos de código se puede lograr el mismo trabajo, pero debemos ponernos de acuerdo en algunas normas en nuestro código.
Los controles, deben tener un prefijo en minúsculas, seguido del nombre de la propiedad que están representando. Por ejemplo si tenemos un control llamado “txtNombre”, el nombre de la propiedad serÃa “Nombre”, si escribimos “dtpFecha”, este DateTimePicker se corresponderá con la property “Fecha” de alguna clase.
Debemos acordarnos de inicializar estos controles luego de que InitializeComponent() sea llamado por nuestro formulario, en caso contrario el ErrorProvider valdrá null.
Ahora vemos como luce una clase que posee la validación de NHibernate.Validator:
Como pueden ver, con algunas clases podemos usar NHibernate.Validator también en la UI, solamente hace falta configurar 1 lÃnea por control y todo queda integrado con Winforms.
No vi NHibernate Validator aun, pero me implemente uno propio que hace (solamente) esto. Lo anoto a mis entities con “restricciones” de validacion y luego el “framework” (200 lineas de codigo como mucho) Hace algo que a mi me parecio interesante:
Recorre los controles de un contenedor que se le envia, generalmente el form, o un group box, etc, luego mira los bindings que este tiene, casi siempre cuando yo programo bindeo los controles en tiempo de disenio, luego de ver que bindings tiene aplica las validaciones a los controles necesarios. El resultado de esto es que agregar validacion a un form siempre requiere las mismas (pocas) lineas que es para setear y hago incapie en que no tengo que decirle como validar cada control en particular (soporte para textbox y drop down lists de momento)