Remplacer et étendre les classes généréesOverride and extend the generated classes

Votre définition DSL est une plateforme sur laquelle vous pouvez créer un ensemble puissant d’outils qui sont basées sur un langage spécifique à un domaine.Your DSL Definition is a platform on which you can build a powerful set of tools that are based on a domain-specific language. Plusieurs extensions et les adaptations réalisables par substitution et extension des classes qui sont générés à partir de la définition DSL.Many extensions and adaptations can be made by overriding and extending the classes that are generated from the DSL Definition. 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, explorer, sérialisation et ainsi de suite.These classes include not just the domain classes that you have explicitly defined in the DSL Definition diagram, but also other classes that define the toolbox, explorer, serialization, and so on.

Mécanismes d’extensibilitéExtensibility Mechanisms

Plusieurs mécanismes sont fournis pour vous permettre d’étendre le code généré.Several mechanisms are provided to allow you to extend the generated code.

Substituer des méthodes dans une classe partielleOverride methods in a partial class

Définitions de classe partielle permettent à une classe d’être défini dans plusieurs endroits.Partial class definitions allow a class to be defined in more than one place. Cela vous permet de séparer le code généré à partir du code que vous écrivez vous-même.This allows you to separate the generated code from the code that you write yourself. Dans votre code écrit manuellement, vous pouvez remplacer les classes héritées par le code généré.In your manually-written code, you can override classes inherited by the generated code.

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 :For example, if in your DSL Definition you define a domain class named Book, you could write custom code that adds override methods:

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

Note

Pour substituer les méthodes dans une classe générée, vous devez toujours écrire votre code dans un fichier séparé à partir des fichiers générés.To override methods in a generated class, always write your code in a file that is separated from the generated files. En règle générale, le fichier se trouve dans un dossier nommé CustomCode.Typically, the file is contained in a folder that is named CustomCode. Si vous apportez des modifications au code généré, ils seront perdus lorsque vous régénérez le code à partir de la définition DSL.If you make changes to the generated code, they will be lost when you regenerate the code from the DSL Definition.

Pour découvrir les méthodes que vous pouvez substituer, tapez remplacer dans la classe, suivi d’un espace.To discover what methods you can override, type override in the class, followed by a space. L’info-bulle IntelliSense vous indique quelles méthodes peuvent être remplacées.The IntelliSense tooltip will tell you what methods can be overridden.

Classes dérivées en doubleDouble-Derived Classes

La plupart des méthodes dans les classes générées est héritée d’un ensemble fixe de classes dans les espaces de noms de modélisation.Most of the methods in generated classes are inherited from a fixed set of classes in the Modeling namespaces. Toutefois, certaines méthodes sont définies dans le code généré.However, some methods are defined in the generated code. En règle générale, cela signifie que vous ne pouvez pas remplacer ; dans une classe partielle, vous ne pouvez pas remplacer les méthodes qui sont définies dans une autre définition partielle de la même classe.Ordinarily, this means that you cannot override them; you cannot override in one partial class the methods that are defined in another partial definition of the same class.

Néanmoins, vous pouvez substituer ces méthodes en définissant le génère une Double dérivée indicateur pour la classe de domaine.Nevertheless, you can override these methods by setting the Generates Double Derived flag for the domain class. Cette entraîne deux classes à générer, celui qui est une classe de base abstraite de l’autre.This causes two classes to be generated, one being an abstract base class of the other. Toutes les définitions de méthode et la propriété sont dans la classe de base, et uniquement le constructeur est dans la classe dérivée.All the method and property definitions are in the base class, and only the constructor is in the derived class.

Par exemple, dans l’exemple Library.dsl, le CirculationBook de classe de domaine a la Generates``Double Derived propriété définie sur true.For example, in the sample Library.dsl, the CirculationBook domain class has the Generates``Double Derived property set to true. Le code généré pour cette classe de domaine contient deux classes :The generated code for that domain class contains two classes:

  • CirculationBookBase, qui est abstraite et qui contient toutes les méthodes et propriétés.CirculationBookBase, which is an abstract and which contains all the methods and properties.

  • CirculationBook, qui est dérivée de CirculationBookBase.CirculationBook, which is derived from CirculationBookBase. Il est vide, à l’exception de ses constructeurs.It is empty, except for its constructors.

Pour remplacer n’importe quelle méthode, vous créez une définition partielle de la classe dérivée comme CirculationBook.To override any method, you create a partial definition of the derived class such as CirculationBook. Vous pouvez remplacer les méthodes générées et les méthodes héritées de l’infrastructure de modélisation.You can override both the generated methods and the methods inherited from the modeling framework.

Vous pouvez utiliser cette méthode avec tous les types d’élément, y compris les connecteurs, des relations, des formes, des diagrammes et des éléments de modèle.You can use this method with all types of element, including model elements, relationships, shapes, diagrams, and connectors. Vous pouvez également substituer les méthodes d’autres classes générées.You can also override methods of other generated classes. Certaines classes générées, telles que le ToolboxHelper sont toujours double dérivée.Some generated classes such as the ToolboxHelper are always double-derived.

Constructeurs personnalisésCustom Constructors

Vous ne pouvez pas remplacer un constructeur.You cannot override a constructor. Même dans les classes dérivées de double, le constructeur doit être dans la classe dérivée.Even in double-derived classes, the constructor must be in the derived class.

Si vous souhaitez fournir votre propre constructeur, cela en définissant Has Custom Constructor pour la classe de domaine dans la définition DSL.If you want to provide your own constructor, you can do this by setting Has Custom Constructor for the domain class in the DSL Definition. Lorsque vous cliquez sur transformer tous les modèles, le code généré n’inclura pas un constructeur pour cette classe.When you click Transform All Templates, the generated code will not include a constructor for that class. Il inclut un appel au constructeur manquant.It will include a call to the missing constructor. Cela entraîne un rapport d’erreurs lorsque vous générez la solution.This causes an error report when you build the solution. Double-cliquez sur le rapport d’erreurs pour afficher un commentaire dans le code généré qui explique ce que vous devez fournir.Double-click the error report to see a comment in the generated code that explains what you should provide.

Écrire une définition de classe partielle dans un fichier distinct à partir des fichiers générés et fournir le constructeur.Write a partial class definition in a file that is separate from the generated files, and provide the constructor.

Points d’Extension avec indicateurFlagged Extension Points

Un point d’extension comportant 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.A flagged extension point is a place in the DSL Definition where you can set a property or a check box to indicate that you will provide a custom method. Constructeurs personnalisés sont un exemple.Custom constructors are one example. D’autres exemples incluent le paramètre de la Kind d’une propriété de domaine à Calculated ou stockage de personnalisée ou paramètre la personnalisé est indicateur dans le Générateur de connexion.Other examples include setting the Kind of a domain property to Calculated or Custom Storage or setting the Is Custom flag in a connection builder.

Dans chaque cas, lorsque vous définissez l’indicateur et régénérez le code, une erreur de build se produit.In each case, when you set the flag and regenerate the code, a build error will result. Double-cliquez sur l’erreur pour afficher un commentaire qui explique ce que vous devez fournir.Double-click the error to see a comment that explains what you have to provide.

RèglesRules

Le Gestionnaire de transactions vous permet de définir les règles qui s’exécutent avant la fin d’une transaction dans laquelle un événement désigné s’est produite, telle qu’une modification dans une propriété.The transaction manager allows you to define rules that run before the end of a transaction in which a designated event has occurred, such as a change in a property. Règles sont généralement utilisées pour mettre à jour synchronism entre les différents éléments dans le magasin.Rules are typically used to maintain synchronism between different elements in the store. Par exemple, les règles sont utilisées pour vous assurer que le diagramme affiche l’état actuel du modèle.For example, rules are used to make sure that the diagram displays the current state of the model.

Les règles sont définies sur une base par classe, afin que vous n’avez pas avoir du code qui s’inscrit à la règle pour chaque objet.Rules are defined on a per-class basis, so that you do not have to have code that registers the rule for each object. Pour plus d’informations, consultez propager les modifications dans le modèle de règles.For more information, see Rules Propagate Changes Within the Model.

Événements de StoreStore Events

Le magasin de modélisation fournit un mécanisme d’événement que vous pouvez utiliser pour écouter les types spécifiques de modification dans le magasin, y compris l’ajout et la suppression d’éléments, les modifications apportées aux valeurs de propriété et ainsi de suite.The modeling store provides an event mechanism that you can use to listen for specific types of change in the store, including addition and deletion of elements, changes to property values, and so on. Les gestionnaires d’événements sont appelées après la fermeture de la transaction dans laquelle les modifications ont été apportées.The event handlers are called after the close of the transaction in which the changes were made. En règle générale, ces événements sont utilisés pour mettre à jour des ressources en dehors du magasin.Typically, these events are used to update resources outside the store.

Événements .NET.NET Events

Vous pouvez vous abonner à des événements sur les formes.You can subscribe to some events on shapes. Par exemple, vous pouvez écouter pour les clics de souris sur une forme.For example, you can listen for mouse-clicks on a shape. Vous devez écrire du code qui s’abonne à l’événement pour chaque objet.You have to write code that subscribes to the event for each object. Ce code peut être écrit dans une substitution de InitializeInstanceResources().This code can be written in an override of InitializeInstanceResources().

Certains événements sont générés sur dont ShapeFields, qui sont utilisés pour dessiner des éléments décoratifs sur une forme.Some events are generated on ShapeFields, which are used to draw decorators on a shape. Pour obtenir un exemple, consultez Comment : intercepter un événement Click sur une forme ou un décorateur.For an example, see How to: Intercept a Click on a Shape or Decorator.

Ces événements ne surviennent généralement pas à l’intérieur d’une transaction.These events usually do not occur inside a transaction. Vous devez créer une transaction si vous souhaitez apporter des modifications dans le magasin.You should create a transaction if you want to make changes in the store.