Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette section vous montre comment utiliser du code personnalisé pour accéder, modifier ou créer un modèle dans un langage spécifique au domaine (DSL).
Contexte d’écriture de code pour une DSL
Il existe plusieurs contextes dans lesquels vous pouvez écrire du code qui fonctionne avec une DSL :
Commandes personnalisées. Vous pouvez créer une commande que les utilisateurs peuvent appeler en cliquant avec le bouton droit sur le diagramme, et qui peut modifier le modèle. Pour plus d’informations, consultez Guide pratique pour ajouter une commande au menu contextuel.
Validation. Vous pouvez écrire du code qui vérifie que le modèle est dans un état correct. Pour plus d’informations, consultez Validation dans une langue Domain-Specific.
Outrepasser le comportement par défaut. Vous pouvez modifier de nombreux aspects du code généré à partir de DslDefinition.dsl. Pour plus d’informations, consultez Substitution et extension des classes générées.
Transformation de texte. Vous pouvez écrire des modèles de texte qui contiennent du code qui accède à un modèle et génère un fichier texte, par exemple pour générer du code de programme. Pour plus d’informations, consultez Génération de code à partir d’un langage Domain-Specific.
Autres extensions Visual Studio. Vous pouvez écrire des extensions VSIX distinctes qui lisent et modifient des modèles. Pour plus d’informations, consultez Guide pratique pour ouvrir un modèle à partir d’un fichier dans le code du programme
Magasin In-Memory
Les instances des classes que vous définissez dans DslDefinition.dsl sont conservées dans une structure de données appelée In-Memory Store (IMS) ou Store. Les classes que vous définissez dans un DSL prennent toujours un Stockage comme argument du constructeur. Par exemple, si votre DSL définit une classe appelée Example:
Example element = new Example (theStore);
La conservation d’objets dans le Store, au lieu d’objets ordinaires, offre plusieurs avantages.
Transactions. Vous pouvez regrouper une série de modifications connexes dans une transaction :
using (Transaction t = store.TransactionManager.BeginTransaction("updates")) { // make several changes to Store elements here t.Commit(); }Si une exception se produit pendant les modifications, si bien que le
Commit()final n’est pas effectué, le store est réinitialisé à son état précédent. Cette approche vous permet de vous assurer que les erreurs ne quittent pas le modèle dans un état incohérent. Pour plus d’informations, consultez Navigation et mise à jour d’un modèle dans le code du programme.Relations binaires. Si vous définissez une relation entre deux classes, les instances des deux extrémités possèdent une propriété qui permet de naviguer vers l’autre extrémité. Les deux extrémités sont toujours synchronisées. Par exemple, si vous définissez une relation de parenté avec des rôles nommés Parents et Enfants, vous pouvez écrire :
John.Children.Add(Mary)Les deux expressions suivantes sont désormais vraies :
John.Children.Contains(Mary)Mary.Parents.Contains(John)Vous pouvez également obtenir le même effet en écrivant :
Mary.Parents.Add(John)Pour plus d’informations, consultez Navigation et mise à jour d’un modèle dans le code du programme.
Règles et événements. Vous pouvez définir des règles qui se déclenchent chaque fois que des modifications spécifiées sont apportées. Les règles sont utilisées, par exemple, pour conserver les formes sur le diagramme à jour avec les éléments de modèle qu’ils présentent. Pour plus d’informations, consultez Réponse aux modifications et propagation des modifications.
Sérialisation. Le Store fournit un moyen standard de sérialiser les objets qu’il contient dans un fichier. Vous pouvez personnaliser les règles de sérialisation et de désérialisation. Pour plus d’informations, consultez Personnalisation du stockage de fichiers et de la sérialisation XML.