2/9/2007 13:48
El Bruno
[DSL] Agregando validaciones ...
Buenas
un punto importante a tener en cuenta durante la creación de nuestros modelos, es poder validar la información que poseen los mismos. Utilizando Domain Specific Language Tools tenemos diferentes opciones para realizar validaciones; desde validaciones de tipos de datos (asignadas a las propiedades, por ejemplo), definiciones de multiplicidad entre diferentes relaciones y validaciones personalizadas por código, entre otras.
Para demostrar una validación por código, y partiendo del ejemplo del anterior post, he modificado el elemento User para que posea 2 propiedades: Name y EMail; y además he modificado el Shape que muestra este elemento para que muestre la dirección de EMail además del nombre. El objetivo de este ejemplo es implementar una validación que verifique que no existan 2 usuarios con la misma dirección de mail.
Tutorial
Para lograr esto debemos seguir los siguientes pasos:
1. Es necesario habilitar el menu de validación para que nuestro editor permita validar el modelo. Desde el panel DSL Explorer seleccionamos el nodo Editor // Validation, y desde el panel de propiedades del mismo, habilitamos las validaciones Menu y Save. Estas opciones permiten que se las validaciones se ejecuten desde el menu del editor y cuando se graba el modelo. Generamos el código desde el Solution Explorer y compilamos nuestra solución.
2. Una vez compilado, podremos ver en nuestro proyecto de Debug que desde el editor aparece el menu Validate si desplegamos el menu contextual.
Todavía no hemos implementado la lógica para la validación, pero si queremos probar este tipo de acción, podemos modificar dos usuarios para que posean el mismo nombre; si presionamos Validar o intentamos grabar el modelo, veremos el siguiente error, ya que la propiedad Name está definida como Is Element Name en la definicion de la entidad User.
3. Agregamos una nueva clase llamada ExampleModel.partial.cs a nuestro proyecto y agregamos el siguiente código dentro de la misma. Esta clase posee un método ValidateDuplicatedUserEmails() que verifica que no existan email duplicados y además verifica que las direcciones de email sean válidas (utilizando una expresión regular sacada desde aquí). El método además esta decorado por el atributo ValidationMethod(), con las opciones Menu y Save para que las validaciones se ejecuten en estas acciones.
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.VisualStudio.Modeling.Validation;
using System.Text.RegularExpressions;
namespace ElBruno.Dsl15
{
[ValidationState (ValidationState.Enabled)]
public partial class ExampleModel
{
/// <summary>
/// Validates the duplicated users E mail.
/// </summary>
/// <param name="context">The context.</param>
[ValidationMethod(ValidationCategories.Menu | ValidationCategories.Save)]
private void ValidateDuplicatedUsersEMail(ValidationContext context)
{
Dictionary<string, string> userEMails = new Dictionary<string,string>();
// Validate EMail structure and validate for duplicate email
foreach (UserElement user in this.Userelements)
{
// validate email
if (!IsValidEmail(user.EMail))
{
string msg = string.Format("The email address [{0}] for the user [{1}] is invalid.", user.EMail, user.Name);
context.LogError(msg, "Err01", user);
}
// validate duplicate email
if (userEMails.ContainsKey(user.EMail))
{
string msg = string.Format("The email address [{0}] is duplicated. Is already assigned for the user [{1}].", user.EMail, userEMails[user.EMail].ToString());
context.LogError(msg, "Err01", user);
}
else
{
userEMails.Add(user.EMail, user.Name);
}
}
}
/// <summary>
/// Determines whether [is valid email] [the specified input email].
/// </summary>
/// <param name="inputEmail">The input email.</param>
/// <returns>
/// <c>true</c> if [is valid email] [the specified input email]; otherwise, <c>false</c>.
/// </returns>
private bool IsValidEmail(string inputEmail)
{
string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
Regex re = new Regex(strRegex);
if (re.IsMatch(inputEmail))
return (true);
else
return (false);
}
}
}
Nota: cuando se registra un error utilizando ValidationContext.LogError(), uno de los parametros que recibe es la entidad donde se registra el error. Esto permite que cuando se registra un error y se visualiza en la ventana de Error de Visual Studio, al hacer doble click sobre el error, Visual Studio selecciona y pone el foco sobre la entidad que originó el error.
4. Si ejecutamos el proyecto en modo Debug, y configuramos algunas de las opciones para que existan direcciones de mail inválidas y direcciones de email duplicadas, podremos verificar si nuestro metodo de validación funciona correctamente. La siguiente imagen muestra un ejemplo:
Si seleccionamos la opción validar o intenamos grabar el proyecto veremos que tenemos los siguientes errores, una dirección de email inválida y una dirección duplicada. Haciendo doble click sobre cada uno de los errores podremos navegar a la entidad que originó el error:
Descargas y Código Fuente
El código fuente del ejemplo se puede descargar desde aquí (gracias Geeks.ms) o utilizando SkyDrive desde aquí.
Dsl15-Validations
Y un pequeño video de ejemplo
Video: DSL Tools - Validations
Saludos @ Home
El Bruno
Crossposting from
ElBruno.com
Archivado en: Visual Studio,VSTS,DSL Tools
Comparte este post: