Partager via


Remplacer et étendre les classes générées

Votre définition DSL est une plateforme sur laquelle vous pouvez créer un ensemble puissant d’outils basés sur un langage spécifique au domaine. De nombreuses extensions et adaptations peuvent être effectuées en substituant et en étendant les classes générées à partir de la définition DSL. Ces classes incluent non seulement les classes de domaine que vous avez explicitement définies dans le diagramme de définition DSL, mais également d’autres classes qui définissent la boîte à outils, l’explorateur, la sérialisation, et ainsi de suite.

Mécanismes d’extensibilité

Plusieurs mécanismes vous permettent d’étendre le code généré.

Remplacer des méthodes dans une classe partielle

Les définitions de classes partielles permettent à une classe d’être définie à plusieurs endroits. Cela vous permet de séparer le code généré du code que vous écrivez vous-même. Dans votre code écrit manuellement, vous pouvez remplacer les classes héritées par le code généré.

Par exemple, si dans votre définition DSL, vous définissez une classe de domaine nommée Book, vous pouvez écrire du code personnalisé qui ajoute des méthodes de remplacement :

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

Note

Pour remplacer les méthodes d’une classe générée, écrivez toujours votre code dans un fichier séparé des fichiers générés. En règle générale, le fichier est contenu dans un dossier nommé CustomCode. Si vous apportez des modifications au code généré, elles seront perdues lorsque vous régénérez le code à partir de la définition DSL.

Pour découvrir les méthodes que vous pouvez remplacer, tapez remplacer dans la classe, suivie d’un espace. L’info-bulle IntelliSense vous indique quelles méthodes peuvent être substituées.

classes double-dérivées

La plupart des méthodes des classes générées sont héritées d’un ensemble fixe de classes dans les espaces de noms Modeling. Toutefois, certaines méthodes sont définies dans le code généré. En règle générale, cela signifie que vous ne pouvez pas les remplacer ; vous ne pouvez pas remplacer dans une classe partielle les méthodes définies dans une autre définition partielle de la même classe.

Toutefois, vous pouvez remplacer ces méthodes en définissant l’indicateur Generates Double Derived pour la classe de domaine. Cela entraîne la génération de deux classes, l’une étant une classe de base abstraite de l’autre. Toutes les définitions de méthode et de propriété se trouvent dans la classe de base, et seul le constructeur se trouve dans la classe dérivée.

Par exemple, dans l’exemple Library.dsl, la classe de domaine CirculationBook a la propriété Generates``Double Derived définie sur true. Le code généré pour cette classe de domaine contient deux classes :

  • CirculationBookBase, qui est un abstrait et qui contient toutes les méthodes et propriétés.

  • CirculationBook, qui est dérivé de CirculationBookBase. Il est vide, à l’exception de ses constructeurs.

Pour remplacer n’importe quelle méthode, vous créez une définition partielle de la classe dérivée telle que CirculationBook. Vous pouvez remplacer les méthodes générées et les méthodes héritées de l’infrastructure de modélisation.

Vous pouvez utiliser cette méthode avec tous les types d’éléments, notamment les éléments de modèle, les relations, les formes, les diagrammes et les connecteurs. Vous pouvez également remplacer les méthodes d’autres classes générées. Certaines classes générées, telles que ToolboxHelper, sont toujours dérivées deux fois.

Constructeurs personnalisés

Vous ne pouvez pas remplacer un constructeur. Même dans les classes dérivées de manière double, le constructeur doit se trouver dans la classe dérivée.

Si vous souhaitez fournir votre propre constructeur, vous pouvez le faire en définissant Has Custom Constructor la classe de domaine dans la définition DSL. Lorsque vous cliquez sur Transformer tous les modèles, le code généré n’inclut pas de constructeur pour cette classe. Il inclut un appel au constructeur manquant. Cela provoque un rapport d’erreur lorsque vous générez la solution. Double-cliquez sur le rapport d’erreur pour afficher un commentaire dans le code généré qui explique ce que vous devez fournir.

Écrivez une définition de classe partielle dans un fichier distinct des fichiers générés et fournissez le constructeur.

Points d’extension avec indicateur

Un point d’extension avec indicateur est un emplacement dans la définition DSL où vous pouvez définir une propriété ou une case à cocher pour indiquer que vous fournirez une méthode personnalisée. Les constructeurs personnalisés sont un exemple. D'autres exemples incluent la configuration d'une propriété de domaine sur "Calculé" ou "Stockage personnalisé", ou la mise en place de l'indicateur Is Custom dans un générateur de connexions.

Dans chaque cas, lorsque vous définissez l’indicateur et régénérez le code, une erreur de génération se produit. Double-cliquez sur l’erreur pour afficher un commentaire qui explique ce que vous devez fournir.

Règles

Le gestionnaire de transactions vous permet de définir des règles qui s’exécutent avant la fin d’une transaction dans laquelle un événement désigné s’est produit, par exemple une modification dans une propriété. Les règles sont généralement utilisées pour maintenir le synchronisme entre différents éléments du magasin. Par exemple, les règles sont utilisées pour s’assurer que le diagramme affiche l’état actuel du modèle.

Les règles sont définies par classe, de sorte que vous n’avez pas besoin d’avoir du code qui inscrit la règle pour chaque objet. Pour plus d’informations, consultez Comment les règles propagent des modifications dans le modèle.

Événements en magasin

Le magasin de modélisation fournit un mécanisme d’événement que vous pouvez utiliser pour écouter des types spécifiques de modification dans le magasin, notamment l’ajout et la suppression d’éléments, les modifications apportées aux valeurs de propriété, et ainsi de suite. Les gestionnaires d’événements sont appelés après la fermeture de la transaction dans laquelle les modifications ont été apportées. En règle générale, ces événements sont utilisés pour mettre à jour des ressources en dehors du magasin.

Événements .NET

Vous pouvez vous abonner à certains événements sur des formes. Par exemple, vous pouvez écouter les clics de souris sur une forme. Vous devez écrire du code qui s’abonne à l’événement pour chaque objet. Ce code peut être écrit dans une surcharge de InitializeInstanceResources().

Certains événements sont générés dans les ShapeFields, qui servent à ajouter des décorateurs sur une forme. Pour un exemple, consultez Comment intercepter un clic sur une forme ou un élément d’interface.

Ces événements ne se produisent généralement pas à l’intérieur d’une transaction. Vous devez créer une transaction si vous souhaitez apporter des modifications dans le magasin.