7/2/2008 19:26 El Bruno

[DSL] Interceptando los cambios en una propiedad 2da parte (ahora con reglas)

Buenas

hace unos días preguntaban en los foros de extensibilidad de MSDN, como interceptar y trabajar "a mano" cuando se cambien los valores de una propiedad en un elemento en un diagrama creado con las Domain Specific Language Tools. Rápidamente postee la respuesta y además me sirvió de base para escribir un pequeño post al respecto [DSL] Interceptando los cambios en una propiedad.

Esta solución es válida, pero existen varias formas de realizar esta tarea. Otra forma es utilizar CustomRules en los diagramas; estas reglas son clases especiales que heredan de una familia de reglas "base" y que una vez registradas, permiten interceptar las acciones que se realizan sobre nuestro diagrama. Desde un punto de vista práctico, funcionan muy parecido a un entorno orientado a aspectos ya que las mismas no "influyen" sobre el código original de los objetos que se han creado en el diagrama.

Pues bien, para seguir madurando el ejemplo de usuario y proyectos con el que hago las pruebas, en este caso simularé una regla donde no se me permita agregar un nombre que contenga la cadena "xxx".

 

Para esto agregaremos una nueva clase parcial para el modelo general llamada Dsl15DomainModel y dentro de la misma agregaremos una nueva clase llamada UserElementChangeRule que hereda de ChangeRule.

Lo interesante de este enfoque al momento de controlar los cambios en una clase es que, esta regla se disparará en cada ocasión que un cambio se detecte dentro de una instancia de una clase del tipo UserElement y además, podremos especificar si queremos interceptarla en el Commit de los cambios o en tiempo real.

1 /// <summary> 2 /// Validates the change of a property in the UserElement class 3 /// </summary> 4 [RuleOn(typeof(UserElement), FireTime = TimeToFire.TopLevelCommit)] 5 public class UserElementChangeRule : ChangeRule 6 { 7 /// <summary> 8 /// Alerts listeners that a property for an element has changed. 9 /// </summary> 10 /// <param name="e">Provides data for the ElementPropertyChanged event.</param> 11 public override void ElementPropertyChanged(ElementPropertyChangedEventArgs e) 12 { 13 bool applyChanges = true; 14 15 // check for FileName property 16 if (e.DomainProperty.Id == UserElement.NameDomainPropertyId) 17 { 18 if (e.NewValue.ToString().Contains("xxx")) 19 { 20 // do not apply cahnges and undo the current change property transaction 21 applyChanges = false; 22 Transaction t = e.ModelElement.Store.TransactionManager.CurrentTransaction; 23 if (t != null) 24 t.Rollback(); 25 Trace.WriteLine("An invalid name was typed: " + e.NewValue.ToString()); 26 } 27 } 28 29 // apply changes with base operation 30 if (applyChanges) 31 base.ElementPropertyChanged(e); 32 } 33 } 34

 

Dentro de la funcion, UserElementPropertyChanged en este caso verificamos si la propiedad que está cambiando es la propiedad nombre y luego dentro de la misma, aplicamos el filtro de la "xxx". Es interesante remarcar, que la acción que debemos realizar para cancelar el cambio es obtener la transacción actual y realizar un Rollback() sobre la misma.

Finalmente es necesario registrar esta CustomRule dentro de la generación de tipos; para esto sobreescribimos la funcion GetCustomDomainModelTypes() de la clase principal de nuestro diagrama y dentro de la misma, retornamos el tipo de nuestra CustomRule como muestro en el siguiente ejemplo.

1 public partial class Dsl15DomainModel 2 { 3 /// <summary> 4 /// Gets the non-generated domain model types. 5 /// </summary> 6 /// <returns>An array of types.</returns> 7 protected override Type[] GetCustomDomainModelTypes() 8 { 9 return new System.Type[] { typeof(UserElementChangeRule) }; 10 } 11 } 12

De esta manera, cada vez que se introduzca un nombre que contenga la cadena "xxx" este cambio no se aplicará a la propiedad y se registrará el error en el OutputViewer de Visual Studio.

Download Sample Project: http://geeks.ms/files/folders/elbruno/entry69859.aspx


Video: DSL Tools - Custom Rules

 

 

Saludos @ La Finca

El Bruno

English subject: [DSL] Handling element's property changes using custom rules

Share this post :
Crossposting from ElBruno.com
Archivado en: ,,
Comparte este post: