Substitution et extension des classes généréesOverriding and Extending the Generated Classes

Définition de votre 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 est possible en substituant et en étendant les classes générées à 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 définis explicitement dans le schéma de définition DSL, mais également d’autres classes qui définissent la boîte à outils, l’Explorateur, 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 fournies pour vous permettre d’étendre le code généré.Several mechanisms are provided to allow you to extend the generated code.

Méthodes de substitution dans une classe partielleOverriding methods in a partial class

Définitions de classe partielles permettent à une classe d’être définie dans plusieurs emplacements.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 override :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é, elles seront perdues 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 substitué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 les ; dans une classe partielle, vous ne peut pas substituer 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.

Toutefois, 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 causes 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 seulement 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 classe de domaine a la Generates``Double Derived propriété 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 substituer 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 des 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 dérivées en double.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’inclut pas un constructeur de cette classe.When you click Transform All Templates, the generated code will not include a constructor for that class. Elle inclut un appel au constructeur manquant.It will include a call to the missing constructor. Cela provoque 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 visualiser 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.

Écriture d’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 avec indicateur est l’emplacement dans la définition DSL dans laquelle vous pouvez définir une propriété ou une case à cocher pour indiquer que vous fournissez 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. Autres exemples de paramètre de la Kind d’une propriété de domaine à calculée ou stockage de personnalisée ou un paramètre le personnalisé d’est indicateur dans un 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 entraîne.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, tels qu’un changement 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 pour que le 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.

Stocker les événementsStore 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 de la banque.Typically, these events are used to update resources outside the store.

Événements .NET.NET Events

Vous pouvez vous abonner à certains é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 ShapeFields, qui sont utilisés pour dessiner les é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 clic sur une forme ou un élément décoratif.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.