Freigeben über


Schreiben von Code zum Anpassen einer domänenspezifischen Sprache

In diesem Abschnitt wird gezeigt, wie Sie mithilfe von benutzerdefiniertem Code ein Modell in einer domänenspezifischen Sprache (DSL) erstellen, es ändern oder darauf zugreifen.

Kontext zum Schreiben von Code für eine DSL

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

In-Memory-Speicher

Instanzen der Klassen, die Sie in DslDefinition.dsl definieren, werden in einer Datenstruktur abgelegt, die als In-Memory-Speicher (IMS) oder Speicher bezeichnet wird. Die in einer DSL definierten Klassen verwenden immer einen Speicher als Argument für den Konstruktor. Wenn Ihre DSL beispielsweise eine Klasse mit dem Namen Example definiert:

Example element = new Example (theStore);

Aufbewahrung der Objekte im Speicher bietet gegenüber gewöhnlichen Objekten mehrere Vorteile.

  • Transaktionen: Sie können eine Reihe von zusammenhängenden Änderungen in einer Transaktion zusammenfassen:

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

    Wenn es während der Änderungen zu einer Ausnahme kommt, sodass der abschließende Commit() nicht ausgeführt wird, wird der Speicher auf seinen vorherigen Zustand zurückgesetzt. Mit diesem Ansatz können Sie sicherstellen, dass das Modell nicht durch Fehler in einen inkonsistenten Zustand versetzt wird. Weitere Informationen finden Sie unter Navigieren in und Aktualisieren von Modellen im Programmcode.

  • Binäre Beziehungen: Wenn Sie eine Beziehung zwischen zwei Klassen definieren, verfügen die Instanzen an beiden Endpunkten über eine Eigenschaft, die auf den jeweils anderen Endpunkt verweist. Die beiden Endpunkte werden stets synchronisiert. Wenn Sie beispielsweise eine Elternschaftsbeziehung mit den Rollen Parents und Children definieren, könnten 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 den gleichen Effekt erzielen, indem Sie Folgendes schreiben:

    Mary.Parents.Add(John)

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

  • Regeln und Ereignisse: Sie können Regeln definieren, die immer dann ausgelöst werden, wenn angegebene Änderungen vorgenommen werden. Regeln werden beispielsweise verwendet, um Formen im Diagramm mit den Modellelementen aktuell zu halten, die sie repräsentieren. Weitere Informationen finden Sie unter Reagieren auf und Verteilen von Änderungen.

  • Serialisierung: Der Speicher bietet eine Standardmethode für die Serialisierung der darin enthaltenen Objekte in einer Datei. Sie können die Regeln für die Serialisierung und Deserialisierung anpassen. Weitere Informationen finden Sie unter Anpassen von Dateispeicher und XML-Serialisierung.