Freigeben über


Schreiben von Code zum Anpassen einer domänenspezifischen Sprache

In diesem Abschnitt wird gezeigt, wie Sie benutzerdefinierten Code verwenden, um auf ein Modell in einer domänenspezifischen Sprache (DSL) zuzugreifen, zu ändern oder zu erstellen.

Kontext zum Schreiben von Code für ein DSL

Es gibt mehrere Kontexte, in denen Sie Code schreiben können, der mit einem DSL funktioniert:

In-Memory Store

Instanzen der Klassen, die Sie in DslDefinition.dsl definieren, werden in einer Datenstruktur gespeichert, die alsIn-Memory Store (IMS) oder Store bezeichnet wird. Diejenigen Klassen, die Sie in einem DSL definieren, nehmen immer einen Store als Argument für den Konstruktor. Wenn Ihr DSL z. B. eine Klasse mit dem Namen Example:

Example element = new Example (theStore);

Das Aufbewahren von Objekten im Store bietet mehrere Vorteile im Vergleich zur Speicherung als gewöhnliche Objekte.

  • Transaktionen. Sie können eine Reihe verwandter Änderungen in eine Transaktion gruppieren:

    using (Transaction t = store.TransactionManager.BeginTransaction("updates"))
    {
      // make several changes to Store elements here
      t.Commit();
    }
    

    Wenn während der Änderungen eine Ausnahme auftritt, sodass das Endgültige Commit() nicht ausgeführt wird, wird der Store auf den vorherigen Zustand zurückgesetzt. Mit diesem Ansatz können Sie sicherstellen, dass Fehler das Modell nicht in einem inkonsistenten Zustand belassen. Weitere Informationen finden Sie unter Navigieren und Aktualisieren eines Modells im Programmcode.

  • Binäre Beziehungen. Wenn Sie eine Beziehung zwischen zwei Klassen definieren, verfügen Instanzen an beiden Enden über eine Eigenschaft, die zum anderen Ende navigiert. Die beiden Enden werden immer synchronisiert. Wenn Sie beispielsweise eine Elternschaftsbeziehung mit Rollen namens "Eltern und Kinder" definieren, können Sie Folgendes schreiben:

    John.Children.Add(Mary)

    Beide der folgenden Ausdrücke sind jetzt wahr:

    John.Children.Contains(Mary)

    Mary.Parents.Contains(John)

    Sie können auch den gleichen Effekt erzielen, indem Sie Folgendes schreiben:

    Mary.Parents.Add(John)

    Weitere Informationen finden Sie unter Navigieren und Aktualisieren eines Modells im Programmcode.

  • Regeln und Ereignisse. Sie können Regeln definieren, die ausgelöst werden, wenn bestimmte Änderungen vorgenommen werden. Regeln werden z. B. verwendet, um Formen im Diagramm mit den Modellelementen auf dem neuesten Stand zu halten. Weitere Informationen finden Sie unter Reagieren auf und Weitergeben von Änderungen.

  • Serialisierung. Der Store stellt eine Standardmethode zum Serialisieren der darin enthaltenen Objekte in eine Datei bereit. Sie können die Regeln für die Serialisierung und Deserialisierung anpassen. Weitere Informationen finden Sie unter Anpassen der Dateispeicher- und XML-Serialisierung.