Escritura de código para personalizar un lenguaje específico de dominio
En esta sección se muestra cómo usar código personalizado para crear y modificar un modelo de un lenguaje específico de dominio (DSL), y para acceder a él.
Contexto para escribir código para un DSL
Hay varios contextos en los que puede escribir código que funcione con un DSL:
Comandos personalizados. Puede crear un comando que los usuarios puedan invocar haciendo clic con el botón derecho en el diagrama, y que pueda modificar el modelo. Para más información, consulte Adición de un comando al menú contextual.
Validation (Validación). Puede escribir código que compruebe que el modelo está en un estado correcto. Para más información, consulte Validación en los lenguajes específicos de dominio.
Invalidación del comportamiento predeterminado. Puede modificar muchos aspectos del código que se genera a partir de DslDefinition.dsl. Para más información, consulte Invalidación y extensión de las clases generadas.
Transformación de texto. Puede escribir plantillas de texto que contengan código que acceda a un modelo y genere un archivo de texto, por ejemplo, para generar código de programa. Para más información, consulte Generación de código a partir de un lenguaje específico de dominio.
Otras extensiones de Visual Studio. Puede escribir extensiones VSIX distintas que lean y modifiquen modelos. Para más información, consulte Apertura de un modelo UML desde un archivo en el código del programa.
Almacén en memoria
Las instancias de las clases que defina en DslDefinition.dsl se mantienen en una estructura de datos llamada Almacén en memoria (IMS) o Almacén. Las clases que defina en un DSL siempre toman un almacén como argumento para el constructor. Por ejemplo, si el DSL define una clase llamada Example
:
Example element = new Example (theStore);
Mantener los objetos en el almacén, en lugar de como objetos normales, proporciona varias ventajas.
Transacciones. Puede agrupar una serie de cambios relacionados en una transacción:
using (Transaction t = store.TransactionManager.BeginTransaction("updates")) { // make several changes to Store elements here t.Commit(); }
Si se produce una excepción durante los cambios, de modo que no se realiza la operación
Commit()
final, el almacén se restablece a su estado anterior. Este enfoque le ayuda a asegurarse de que los errores no dejan el modelo en un estado incoherente. Para más información, consulte Navegar por un modelo en el código del programa y actualizarlo.Relaciones binarias. Si define una relación entre dos clases, las instancias de ambos extremos tienen una propiedad que dirige al otro extremo. Los dos extremos siempre se sincronizan. Por ejemplo, si define una relación de parentesco con roles Padres e Hijos, podría escribir:
John.Children.Add(Mary)
Las dos expresiones siguientes ahora son verdaderas:
John.Children.Contains(Mary)
Mary.Parents.Contains(John)
También puede lograr lo mismo escribiendo:
Mary.Parents.Add(John)
Para más información, consulte Navegar por un modelo en el código del programa y actualizarlo.
Reglas y eventos. Puede definir reglas que se activen cada vez que se realicen cambios especificados. Las reglas se usan, por ejemplo, para mantener las formas en el diagrama actualizadas con los elementos del modelo que presentan. Para más información, consulte Responder a los cambios y propagarlos.
Serialización. El almacén proporciona una manera estándar de serializar los objetos que contiene en un archivo. Puede personalizar las reglas de serialización y deserialización. Para más información, consulte Personalización del almacenamiento de archivos y la serialización XML.