Invalidación y ampliación de las clases generadas

La definición de DSL es una plataforma en la que puede crear un potente conjunto de herramientas basadas en un lenguaje específico de dominio. Muchas extensiones y adaptaciones se pueden realizar invalidando y ampliando las clases que se generan a partir de la definición de DSL. Estas clases incluyen no solo las clases de dominio que ha definido explícitamente en el diagrama de definición de DSL, sino también otras clases que definen el cuadro de herramientas, el explorador, la serialización, etc.

Mecanismos de extensibilidad

Se proporcionan varios mecanismos para permitirle ampliar el código generado.

Métodos de invalidación en una clase parcial

Las definiciones de clase parcial permiten definir una clase en más de un lugar. Esto le permite separar el código generado del código que escribe usted mismo. En el código escrito manualmente, puede invalidar las clases heredadas con el código generado.

Por ejemplo, si en la definición de DSL define una clase de dominio denominada Book, podría escribir código personalizado que agregue métodos de invalidación:

public partial class Book
{
   protected override void OnDeleting()
   {
      MessageBox.Show("Deleting book " + this.Title);
      base.OnDeleting();
   }
}

Nota

Para invalidar los métodos de una clase generada, escriba siempre el código en un archivo distinto de los archivos generados. Normalmente, el archivo se encuentra en una carpeta denominada CustomCode. Si realiza cambios en el código generado, se perderán al regenerar el código de la definición de DSL.

Para detectar qué métodos se pueden invalidar, escriba override en la clase, seguido de un espacio. La información sobre herramientas de IntelliSense le indicará qué métodos se pueden invalidar.

Clases con derivación doble

La mayoría de los métodos de las clases generadas se heredan de un conjunto fijo de clases de los espacios de nombres de Modelado. Sin embargo, algunos métodos se definen en el código generado. Normalmente, esto significa que no se pueden invalidar. No se puede invalidar en una clase parcial los métodos que se definieron en otra definición parcial de la misma clase.

Sin embargo, puede invalidar estos métodos estableciendo la marca Generates Double Derived para la clase de dominio. Esto hace que se generen dos clases, en la que una es una clase base abstracta de la otra. Todas las definiciones del método y la propiedad están en la clase base y solo el constructor está en la clase derivada.

Por ejemplo, en el archivo Library.dsl de ejemplo, la clase de dominio CirculationBook tiene la propiedad Generates``Double Derived establecida en true. El código generado para esa clase de dominio contiene dos clases:

  • CirculationBookBase, que es una clase abstracta que contiene todos los métodos y propiedades.

  • CirculationBook, que se deriva de CirculationBookBase. Está vacía, excepto por sus constructores.

Para invalidar cualquier método, puede crear una definición parcial de la clase derivada, como CirculationBook. Puede invalidar los métodos generados y los métodos heredados del marco de modelado.

Puede usar este método con todos los tipos de elementos, incluidos los elementos del modelo, las relaciones, las formas, los diagramas y los conectores. También puede invalidar métodos de otras clases generadas. Algunas clases generadas, como ToolboxHelper, siempre tienen doble derivación.

Constructores personalizados

No se puede invalidar un constructor. Incluso en clases con doble derivación, el constructor debe estar en la clase derivada.

Si desea proporcionar su propio constructor, puede hacerlo estableciendo Has Custom Constructor para la clase de dominio en la definición de DSL. Al hacer clic en Transformar todas las plantillas, el código generado no incluirá un constructor para esa clase. Incluirá una llamada al constructor que falta. Esto provoca un informe de errores al crear la solución. Haga doble clic en el informe de errores para ver un comentario en el código generado que explique qué debe proporcionar.

Escriba una definición de clase parcial en un archivo que sea independiente de los archivos generados y proporcione el constructor.

Puntos de extensión marcados

Un punto de extensión marcado es un lugar en la definición de DSL, donde puede establecer una propiedad o una casilla para indicar que proporcionará un método personalizado. Los constructores personalizados son un ejemplo. Otros ejemplos incluyen el establecimiento del valor Kind de una propiedad de dominio en Calculated o Custom Storage, o el establecimiento de la marca Is Custom en un generador de conexiones.

En cada caso, al establecer la marca y regenerar el código, se producirá un error de compilación. Haga doble clic en el error para ver un comentario que explica lo que tiene que proporcionar.

Reglas

El administrador de transacciones le permite definir reglas que se ejecutan antes del final de una transacción en la que se ha producido un evento designado, como un cambio de una propiedad. Las reglas se suelen usar para mantener la sincronización entre los distintos elementos del almacén. Por ejemplo, las reglas se usan para asegurarse de que el diagrama muestra el estado actual del modelo.

Las reglas se definen por clase, por lo que no es necesario tener un código que registre la regla para cada objeto. Para más información, consulte Las reglas propagan los cambios dentro del modelo.

Eventos de almacén

El almacén de modelado proporciona un mecanismo de eventos que puede usar para escuchar tipos específicos de cambios en el almacén, incluida la adición y eliminación de elementos, cambios en los valores de propiedad, etc. Se llama a los controladores de eventos después del cierre de la transacción en la que se realizaron los cambios. Normalmente, estos eventos se usan para actualizar los recursos fuera del almacén.

Eventos de .NET

Puede suscribirse a algunos eventos de las formas. Por ejemplo, puede escuchar los clics del mouse en una forma. Debe escribir código que se suscriba al evento para cada objeto. Este código se puede escribir en una invalidación de InitializeInstanceResources().

Algunos eventos se generan en ShapeFields, que se usan para dibujar decoradores en una forma. Para ver un ejemplo, consulte Cómo: Interceptar un clic en una forma o decorador.

Normalmente, estos eventos no se producen dentro de una transacción. Debe crear una transacción si desea realizar cambios en el almacén.