Berechnete und benutzerdefinierte Speichereigenschaften

Alle Domäneneigenschaften in einer domänenspezifischen Sprache (DSL) können dem Benutzer im Diagramm und in Ihrem Sprach-Explorer angezeigt werden, und Programmcode kann darauf zugreifen. Eigenschaften unterscheiden sich jedoch in der Art und Weise, wie ihre Werte gespeichert werden.

Arten von Domäneneigenschaften

In der DSL-Definition können Sie die Art einer Domäneneigenschaft festlegen, wie in der folgenden Tabelle aufgeführt:

Art der Domäneneigenschaft BESCHREIBUNG
Standard (Standardwert) Eine Domäneneigenschaft, die im Speicher gespeichert und in eine Datei serialisiert wird.
Berechnet Eine schreibgeschützte Domäneneigenschaft, die nicht im Speicher gespeichert, sondern aus anderen Werten berechnet wird. Beispielsweise könnte Person.Age aus Person.BirthDate berechnet werden. Sie müssen den Code angeben, der die Berechnung ausführt. In der Regel berechnen Sie den Wert aus anderen Domäneneigenschaften. Sie können jedoch auch externe Ressourcen verwenden.
Benutzerdefinierter Speicher Eine Domäneneigenschaft, die nicht direkt im Speicher gespeichert wird, aber sowohl abgerufen als auch festgelegt werden kann. Sie müssen die Methoden angeben, die den Wert abrufen und festlegen. Beispielsweise könnte Person.FullAddress in Person.StreetAddress, Person.City und Person.PostalCode gespeichert werden. Sie können auch auf externe Ressourcen zugreifen, z. B. zum Abrufen und Festlegen von Werten aus einer Datenbank. Ihr Code sollte keine Werte im Speicher festlegen, wenn Store.InUndoRedoOrRollback TRUE ist. Weitere Informationen finden Sie unter Transaktionen und benutzerdefinierte Setter.

Bereitstellen von Code für eine Speichereigenschaft

Wenn Sie die Art einer Domäneneigenschaft auf berechnet oder benutzerdefinierter Speicher festlegen, müssen Sie Zugriffsmethoden bereitstellen. Wenn Sie Ihre Lösung erstellen, erfahren Sie über einem Fehlerbericht, was erforderlich ist.

So definieren Sie eine berechnete oder benutzerdefinierte Speichereigenschaft

  1. Wählen Sie in DslDefinition.dsl die Domäneneigenschaft im Diagramm oder im DSL-Explorer aus.

  2. Legen Sie im Fenster Eigenschaften das Feld Art auf Berechnet oder Benutzerdefinierter Speicher fest.

    Stellen Sie sicher, dass Sie auch den Typ auf dem Wert festgelegt haben, den Sie wünschen.

  3. Klicken Sie auf der Symbolleiste des Projektmappen-Explorers auf Alle Vorlagen transformieren.

  4. Klicken Sie im Menü Erstellen auf Projektmappe erstellen.

    Sie erhalten die folgende Fehlermeldung: „<IhreKlasse> enthält keine Definition zum Abrufen von <IhreEigenschaft>“.

  5. Doppelklicken Sie auf die Fehlermeldung.

    Dsl\GeneratedCode\DomainClasses.cs oder DomainRelationships.cs wird geöffnet. Oberhalb des hervorgehobenen Methodenaufrufs werden Sie in einem Kommentar aufgefordert, eine Implementierung für „Get<IhreEigenschaft>()“ bereitzustellen.

    Hinweis

    Diese Datei wird von DslDefinition.dsl generiert. Wenn Sie diese Datei bearbeiten, gehen Ihre Änderungen verloren, wenn Sie das nächste Mal Alle Vorlagen transformieren auswählen. Fügen Sie stattdessen die erforderliche Methode in einer separaten Datei hinzu.

  6. Erstellen oder öffnen Sie eine Klassendatei in einem separaten Ordner, z. B CustomCode\<IhreDomänenklasse.cs>.

    Stellen Sie sicher, dass der Namespace mit dem Namespace im generierten Code identisch ist.

  7. Schreiben Sie in der Klassendatei eine partielle Implementierung der Domänenklasse. Schreiben Sie in der Klasse eine Definition für die fehlende Get-Methode, die dem folgenden Beispiel ähnelt:

    namespace Company.FamilyTree
    {  
      public partial class Person
      {
        int GetAgeValue()
        {
          return System.DateTime.Today.Year - this.BirthYear;
        }
      }
    }
    
  8. Wenn Sie Art auf Benutzerdefinierter Speicher festlegen, müssen Sie auch eine Set-Methode angeben. Zum Beispiel:

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

    Ihr Code sollte keine Werte im Speicher festlegen, wenn Store.InUndoRedoOrRollback TRUE ist. Weitere Informationen finden Sie unter Transaktionen und benutzerdefinierte Setter.

  9. Erstellen Sie das Projekt, und führen Sie es aus.

  10. Testen Sie die Eigenschaft. Stellen Sie sicher, dass Sie die Optionen Rückgängig und Wiederholen testen.

Transaktionen und benutzerdefinierte Setter

In der set-Methode der Eigenschaft „Benutzerdefinierter Speicher“ müssen Sie keine Transaktion öffnen. Die Methode wird normalerweise innerhalb einer aktiven Transaktion aufgerufen.

Die set-Methode kann jedoch auch aufgerufen werden, wenn der Benutzer Rückgängig oder Wiederholen aufruft oder wenn ein Rollback für eine Transaktion ausgeführt wird. Wenn InUndoRedoOrRollback TRUE ist, sollte sich Ihre set-Methode wie folgt verhalten:

  • Sie sollte keine Änderungen im Speicher vornehmen, z. B. anderen Domäneneigenschaften keine Werte zuweisen. Der Rückgängig-Manager legt diese Werte fest.

  • Sie sollte jedoch alle externen Ressourcen wie Datenbank- oder Dateiinhalte oder Objekte außerhalb des Speichers aktualisieren. Dieser Ansatz stellt sicher, dass sie mit den Werten im Speicher synchronisiert sind.

    Zum Beispiel:

    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);
    }
    

Weitere Informationen zu Transaktionen finden Sie unter Navigieren in und Aktualisieren von Modellen im Programmcode.