Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En esta sección se muestra cómo usar código personalizado para acceder, modificar o crear un modelo en un lenguaje específico del dominio (DSL).
Contexto para escribir código para un DSL
Hay varios contextos en los que puede escribir código que funciona 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 puede modificar el modelo. Para obtener más información, vea Cómo: Agregar un comando al menú contextual.
Validación. Puede escribir código que compruebe que el modelo está en un estado correcto. Para obtener más información, vea Validación en un lenguaje Domain-Specific.
Invalidar el comportamiento predeterminado. Puede modificar muchos aspectos del código que se genera a partir de DslDefinition.dsl. Para obtener más información, vea Invalidar y extender las clases generadas.
Transformación de texto. Puede escribir plantillas de texto que contengan código que tenga acceso a un modelo y genere un archivo de texto, por ejemplo, para generar código de programa. Para obtener más información, vea Generar código a partir de un lenguaje Domain-Specific.
Otras extensiones de Visual Studio. Puede escribir extensiones VSIX independientes que lean y modifiquen modelos. Para obtener más información, vea Cómo: Abrir un modelo desde un archivo en código de programa.
In-Memory Store
Las instancias de las clases que defina en DslDefinition.dsl se conservan en una estructura de datos denominada In-Memory Store (IMS) o Store. Las clases que defina en un DSL siempre toman una Store como argumento para el constructor. Por ejemplo, si el DSL define una clase denominada Example:
Example element = new Example (theStore);
Mantener los objetos en la Tienda, en lugar de como objetos ordinarios, ofrece 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 manera que no se ejecute la operación final
Commit(), 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 obtener más información, vea Navegar y actualizar un modelo en código de programa.Relaciones binarias. Si define una relación entre dos clases, las instancias de ambos extremos tienen una propiedad que navega al otro extremo. Los dos extremos siempre se sincronizan. Por ejemplo, si define una relación de parentesco con roles denominados Padres e Hijos, puede escribir:
John.Children.Add(Mary)Ahora se cumplen las dos expresiones siguientes:
John.Children.Contains(Mary)Mary.Parents.Contains(John)También puede lograr el mismo efecto escribiendo:
Mary.Parents.Add(John)Para obtener más información, vea Navegar y actualizar un modelo en código de programa.
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 obtener más información, vea Responder a los cambios y propagarlos.
Serialización. Store proporciona una manera estándar de serializar los objetos que contiene en un archivo. Puede personalizar las reglas para serializar y deserializar. Para obtener más información, consulte Personalización del almacenamiento de archivos y la serialización XML.