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:

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.