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

Votre définition DSL est une plateforme sur laquelle vous pouvez générer un ensemble puissant d'outils basés sur un langage spécifique à un 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 la définition DSL, mais aussi d'autres classes qui définissent la boîte à outils, l'explorateur, la sérialisation, etc.

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 vous définissez dans votre définition DSL une classe de domaine nommée Book, vous pouvez écrire du code personnalisé qui ajoute des méthodes de substitution :

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

Notes

Pour substituer les méthodes d'une classe générée, écrivez toujours votre code dans un fichier distinct 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érerez le code à partir de la définition DSL.

Pour connaître les méthodes que vous pouvez substituer, tapez override dans la classe, suivi d'un espace. L'infobulle IntelliSense vous indique les méthodes qui peuvent être substituées.

Classes dérivées doubles

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 de modélisation. Cependant, 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 substituer ; vous ne pouvez pas substituer dans une classe partielle les méthodes définies dans une autre définition partielle de la même classe.

Mais vous pouvez substituer ces méthodes en activant l’indicateur Génère une double dérivée pour la classe de domaine. Deux classes sont ainsi générées, l'une étant une classe de base abstraite de l'autre. Toutes les définitions de méthodes et de propriétés se trouvent dans la classe de base, et seul le constructeur se trouve dans la classe dérivée.

Par exemple, dans le modèle Library.dsl, la classe de domaine CirculationBook a une 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 une abstraction et qui contient toutes les méthodes et propriétés.

  • CirculationBook, qui est dérivée de CirculationBookBase. Elle est vide, à l'exception de ses constructeurs.

Pour substituer une méthode, vous créez une définition partielle de la classe dérivée telle que CirculationBook. Vous pouvez substituer à la fois 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, y compris les éléments de modèle, les relations, les formes, les diagrammes et les connecteurs. Vous pouvez également substituer les méthodes d'autres classes générées. Certaines classes générées, telles que ToolboxHelper, sont toujours doublement dérivées.

Constructeurs personnalisés

Vous ne pouvez pas remplacer un constructeur. Même dans les classes doubles dérivées, 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 pour la classe de domaine dans la définition DSL. Lorsque vous cliquez sur Transformer tous les modèles, le code généré n'inclura aucun constructeur pour cette classe. Il inclut un appel au constructeur manquant. Cela crée un rapport d’erreur lorsque vous générez la solution. Double-cliquez sur le rapport d'erreurs pour afficher dans le code généré un commentaire expliquant quel code vous devez ajouter.

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

Points d’extension marqués d’un indicateur

Un point d’extension marqué d’un 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 en sont un exemple. D'autres exemples incluent la définition la valeur Kind d’une propriété de domaine sur Calculée ou Stockage personnalisé; ou la définition de l'indicateur Is Custom dans un constructeur de connexion.

Dans chaque cas, lorsque vous activez l'indicateur et que vous régénérez le code, une erreur de compilation se produit. Double-cliquez sur l’erreur pour afficher un commentaire expliquant 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 au cours de laquelle un événement donné s'est produit, par exemple la modification d'une propriété. Les règles sont généralement utilisées pour maintenir le synchronisme entre les différents éléments du magasin. Par exemple, des 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 qu'il n'est pas nécessaire d'avoir un code qui enregistre la règle pour chaque objet. Pour plus d’informations, consultez Propagation de modifications dans le modèle par des règles.

Événements du magasin

Le magasin de modélisation fournit un mécanisme d'événements que vous pouvez utiliser pour écouter des types spécifiques de changements dans le magasin, notamment l'ajout et la suppression d'éléments, les modifications des valeurs des propriétés, etc. Les gestionnaires d'événements sont appelés après la clôture de la transaction au cours de 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 un remplacement d’InitializeInstanceResources().

Certains événements sont générés sur les ShapeFields, utilisés pour dessiner des décorateurs sur une forme. Pour obtenir un exemple, consultez Guide pratique pour intercepter un événement de clic sur une forme ou un décorateur.

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.