Partager via


Propriétés de stockage calculées et personnalisées

Toutes les propriétés de domaine dans un langage spécifique à un domaine (DSL) peuvent être affichées à l’utilisateur sur le diagramme et dans votre Explorateur de langages, et sont accessibles par le code du programme. Toutefois, les propriétés diffèrent dans la façon dont leurs valeurs sont stockées.

Types de propriétés de domaine

Dans la définition DSL, vous pouvez définir le type d’une propriété de domaine, comme indiqué dans le tableau suivant :

Type de propriété de domaine Description
Standard (par défaut) Propriété de domaine enregistrée dans le magasin et sérialisée dans un fichier.
Calculées Propriété de domaine en lecture seule qui n’est pas enregistrée dans le magasin, mais qui est calculée à partir d’autres valeurs. Par exemple, Person.Age peut être calculé à partir de Person.BirthDate. Vous devez fournir le code qui effectue le calcul. En règle générale, vous calculez la valeur à partir d’autres propriétés de domaine. Cependant, vous pouvez également utiliser des ressources externes.
Stockage personnalisé Propriété de domaine qui n’est pas enregistrée directement dans le magasin, mais qui peut faire l’objet à la fois de get et set. Vous devez fournir les méthodes qui obtiennent et définissent la valeur. Par exemple, Person.FullAddress peut être stocké dans Person.StreetAddress, Person.City et Person.PostalCode. Vous pouvez également accéder à des ressources externes, par exemple pour obtenir et définir des valeurs à partir d’une base de données. Votre code ne doit pas définir de valeurs dans le magasin quand Store.InUndoRedoOrRollback a la valeur true. Consultez Transactions et setters personnalisés.

Fourniture de code pour une propriété de stockage

Si vous définissez le type d’une propriété de domaine sur le stockage calculé ou personnalisé, vous devez fournir des méthodes d’accès. Lorsque vous générez votre solution, un rapport d’erreurs vous indique ce qui est nécessaire.

Pour définir une propriété de stockage calculée ou personnalisée

  1. Dans DslDefinition.dsl, sélectionnez la propriété de domaine dans le diagramme ou dans l’Explorateur DSL.

  2. Dans la fenêtre Propriétés, définissez le champ Type sur Calculé ou Stockage personnalisé.

    Vérifiez que vous avez également défini son Type sur ce que vous souhaitez.

  3. Sélectionnez Transformer tous les modèles dans la barre d’outils de l’Explorateur de solutions.

  4. Dans le menu Générer, sélectionnez Générer la solution.

    Le message d’erreur suivant s’affiche : « <VotreClasse> ne contient pas de définition pour Get<VotrePropriété> ».

  5. Double-cliquez sur le message d’erreur.

    Dsl\GeneratedCode\DomainClasses.cs ou DomainRelationships.cs s’ouvre. Au-dessus de l’appel de méthode mis en surbrillance, un commentaire vous invite à fournir une implémentation pour Get<VotrePropriété>().

    Notes

    Ce fichier est généré à partir de DslDefinition.dsl. Si vous modifiez ce fichier, vos modifications sont perdues la prochaine fois que vous sélectionnez Transformer tous les modèles. Ajoutez plutôt la méthode requise dans un fichier distinct.

  6. Créez ou ouvrez un fichier de classe dans un dossier distinct, par exemple CustomCode\<VotreClasseDeDomaine.cs>.

    Assurez-vous que l’espace de noms est le même que dans le code généré.

  7. Dans le fichier de classe, écrivez une implémentation partielle de la classe de domaine. Dans la classe, écrivez une définition pour la méthode manquante Get qui ressemble à l’exemple suivant :

    namespace Company.FamilyTree
    {  
      public partial class Person
      {
        int GetAgeValue()
        {
          return System.DateTime.Today.Year - this.BirthYear;
        }
      }
    }
    
  8. Si vous définissez Type sur Stockage personnalisé, vous devez également fournir une méthode Set. Par exemple :

    void SetAgeValue(int value)
    {
      if (!Store.InUndoRedoOrRollback) this.BirthYear = System.DateTime.Today.Year - value;
    }
    

    Votre code ne doit pas définir de valeurs dans le magasin quand Store.InUndoRedoOrRollback a la valeur true. Consultez Transactions et setters personnalisés.

  9. Créez et exécutez la solution.

  10. Testez la propriété. Veillez à essayer Annuler et Rétablir.

Transactions et setters personnalisés

Dans la méthode set de la propriété Stockage personnalisé, vous n’avez pas besoin d’ouvrir une transaction. La méthode est généralement appelée à l’intérieur d’une transaction active.

Toutefois, la méthode set peut également être appelée si l’utilisateur appelle Annuler ou Rétablir, ou si une transaction est restaurée. Lorsque InUndoRedoOrRollback a la valeur true, votre méthode de set doit se comporter comme suit :

  • Elle ne doit pas apporter de modifications dans le magasin, comme l’attribution de valeurs à d’autres propriétés de domaine. Le gestionnaire d’annulation définit leurs valeurs.

  • Toutefois, il doit mettre à jour toutes les ressources externes, comme le contenu de la base de données ou des fichiers, ou les objets en dehors du magasin. Cette approche permet de s’assurer qu’elles sont conservées en synchronisme avec les valeurs du magasin.

    Par exemple :

    void SetAgeValue(int value)
    {
      // If we are in Undo, no changes to Store objects:
      if (!this.Store.InUndoRedoOrRollback)
      {
        this.BirthYear = System.DateTime.Today.Year - value;
      }
      // But always update external objects:
      System.IO.File.WriteAllText(AgeFile, value);
    }
    

Pour plus d’informations sur les transactions, consultez Navigation et mise à jour d’un modèle dans le code de programme.