Compartir a través de


Invalidación y ampliación de las clases generadas

La definición de DSL es una plataforma sobre la cual puede desarrollar un conjunto potente de herramientas basadas en un lenguaje de dominio específico. 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 permitir ampliar el código generado.

Invalidar métodos 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 se escribe usted mismo. En el código escrito manualmente, puede invalidar las clases heredadas por 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 métodos en una clase generada, escriba siempre el código en un archivo separado 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 a partir de la Definición de DSL.

Para detectar los métodos que puede 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 derivadas dobles

La mayoría de los métodos de las clases generadas se heredan de un conjunto fijo de clases en 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 definidos en otra definición parcial de la misma clase.

Sin embargo, puede invalidar estos métodos estableciendo la marca Generar doble derivada para la clase de dominio. Esto hace que se generen dos clases, siendo una clase base abstracta de la otra. Todas las definiciones de método y 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 CirculationBook clase de dominio tiene la Generates``Double Derived propiedad establecida en true. El código generado para esa clase de dominio contiene dos clases:

  • CirculationBookBase, que es un resumen y que contiene todos los métodos y propiedades.

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

Para invalidar cualquier método, cree 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 elemento, 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 se derivan doblemente.

Constructores personalizados

No se puede invalidar un constructor. Incluso en clases de doble derivación, el constructor debe estar dentro de 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 ausente. Esto causa que se genere un informe de errores al compilar la solución. Haga doble clic en el informe de errores para ver un comentario en el código generado que explica lo que 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 señalado es un lugar en la definición de DSL donde se puede configurar una propiedad o una casilla de verificación para señalar que se proporcionará un método personalizado. Los constructores personalizados son un ejemplo. Otros ejemplos incluyen establecer la Kind propiedad de un dominio en Almacenamiento calculado o personalizado o establecer la marca Is Custom en un generador de conexiones.

En cada caso, cuando se establece la marca y se vuelve a generar el código, se producirá un error de compilación. Haga doble clic en el error para ver un comentario que explique lo que debe proporcionar.

Reglas

El administrador de transacciones 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 en una propiedad. Las reglas se usan normalmente para mantener el sincronismo entre 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 código que registre la regla para cada objeto. Para obtener más información, consulte Reglas de propagación de cambios dentro del modelo.

Eventos de la tienda

El almacén de modelado proporciona un mecanismo de eventos que puede utilizar para detectar tipos específicos de cambios en el almacén, como la adición y eliminación de elementos, los cambios en los valores de propiedad, entre otros. 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 recursos fuera del almacén.

Eventos de .NET

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

En ShapeFields se generan algunos eventos, que se utilizan para dibujar adornos en una forma. Para obtener un ejemplo, vea 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.