Freigeben über


So definieren Sie eine domänenspezifische Sprache

Um eine domänenspezifische Sprache (DSL) zu definieren, erstellen Sie eine Visual Studio-Projektmappe von einer Vorlage. Der zentrale Bestandteil der Projektmappe ist das DSL-Definitionsdiagramm, das in "DslDefinition.dsl" gespeichert wird. Die DSL-Definition definiert die Klassen und Formen der DSL. Nachdem Sie diese Elemente geändert und weitere hinzugefügt haben, können Sie Programmcode hinzufügen, um die DSL weiter anzupassen.

Wenn Sie mit DSLs noch nicht vertraut sind, empfehlen wir, das DSL Tools Lab durchzuarbeiten. Sie finden es auf dieser Website: Visualisierungs- und Modellierungs-SDK

In diesem Thema

Auswählen einer Vorlagenprojektmappe

Muster zum Definieren einer DSL

Modellelementklassen

Formen im Diagramm

Verweise und Konnektoren

Formen, die Listen enthalten: Depot-Formen

Anschlüsse am Rand einer anderen Form

Verantwortlichkeitsbereiche

Eigenschaftentypen

Anpassen der DSL

Problembehandlung

Auswählen einer Vorlagenprojektmappe

Zum Definieren einer DSL müssen folgende Komponenten installiert sein:

Visual Studio

https://go.microsoft.com/fwlink/?LinkId=185579

Visual Studio SDK

https://go.microsoft.com/fwlink/?LinkId=185580

Visual Studio Visualization and Modeling SDK

https://go.microsoft.com/fwlink/?LinkID=186128

Um eine neue domänenspezifische Sprache zu erstellen, erstellen Sie eine neue Visual Studio-Projektmappe von der Projektvorlage "Domänenspezifische Sprache".

So erstellen Sie eine DSL-Projektmappe

  1. Erstellen Sie eine Projektmappe mithilfe der Vorlage Domänenspezifische Sprache, die im Dialogfeld Neues Projekt unter Andere Projekttypen / Erweiterbarkeit zu finden ist.

    Dialogfeld "DSL erstellen"

    Wenn Sie auf OK klicken, wird der Assistent für domänenspezifische Sprachen geöffnet und eine Liste von Vorlagen für DSL-Projektmappen angezeigt.

  2. Klicken Sie auf die einzelnen Vorlagen, um eine Beschreibung anzuzeigen. Wählen Sie die Projektmappe aus, die Ihren Vorstellungen am nächsten kommt.

    Jede DSL-Vorlage definiert eine grundlegende, funktionsfähige DSL. Sie bearbeiten diese DSL nach Ihren Anforderungen.

    Klicken Sie auf die Beispiele, um weitere Informationen anzuzeigen.

    • Wählen Sie Aufgabenfluss aus, um eine DSL mit Verantwortlichkeitsbereichen zu erstellen. Verantwortlichkeitsbereiche sind vertikale oder horizontale Bereiche des Diagramms.

    • Wählen Sie Komponentenmodelle aus, um eine DSL mit Anschlüssen zu erstellen. Anschlüsse sind kleine Formen am Rand einer größeren Form.

    • Wählen Sie Klassendiagramme aus, um eine DSL mit Depot-Formen zu definieren. Depot-Formen enthalten Listen von Elementen.

    • Wählen Sie in anderen Fällen oder wenn Sie sich nicht sicher sind Minimale Sprache aus.

      Hinweis

      Wenn Sie ein Klassendiagramm oder ein Komponentendiagramm erstellen möchten, können Sie auch UML-Modelle verwenden.Die UML-Modellierungstools stellen einen Satz von Diagrammen bereit, die um ein einzelnes Modell herum integriert sind.Sie sind erweiterbar und können über ModelBus in Ihre DSL integriert werden.Weitere Informationen finden Sie unter Entwickeln von Modellen für den Softwareentwurf.

    • Wählen Sie Minimaler WinForm-Designer oder Minimaler WPF-Designer aus, um eine DSL zu erstellen, die auf einer Windows Forms- oder WPF-Oberfläche angezeigt wird. Sie müssen Code zur Definition des Editors schreiben. Weitere Informationen finden Sie unter den folgenden Themen:

      Creating a Windows Forms-Based Domain-Specific Language

      Creating a WPF-Based Domain-Specific Language

  3. Geben Sie auf der entsprechenden Seite des Assistenten eine Dateinamenerweiterung für die DSL ein. Diese Erweiterung wird für Dateien mit Instanzen Ihrer DSL verwendet.

    • Wählen Sie eine Dateinamenerweiterung, die keiner Anwendung auf Ihrem Computer bzw. auf einem Computer, auf dem Sie die DSL installieren möchten, zugeordnet ist. Zum Beispiel sind docx und htm keine akzeptablen Dateinamenerweiterungen.

    • Der Assistent warnt Sie, wenn die eingegebene Erweiterung bereits als DSL verwendet wird. Verwenden Sie nach Möglichkeit eine andere Dateinamenerweiterung. Sie können die experimentelle Instanz des Visual Studio SDK auch zurücksetzen, um alte experimentelle Designer zu löschen. Klicken Sie auf Start und dann nacheinander auf Alle Programme, Microsoft Visual Studio 2010 SDK, Tools und Experimentelle Instanz von Microsoft Visual Studio 2010 zurücksetzen.

  4. Auf den anderen Seiten können Sie Einstellungen anpassen oder die Standardwerte übernehmen.

  5. Klicken Sie auf Fertig stellen.

    Der Assistent erstellt eine Projektmappe mit zwei oder drei Projekten und generiert Code aus der DSL-Definition.

Die Benutzeroberfläche gleicht nun der folgenden Abbildung.

DSL-Designer

Diese Projektmappe definiert eine domänenspezifische Sprache. Weitere Informationen finden Sie unter Overview of the Domain-Specific Language Tools User Interface.

Testen der Projektmappe

Die Vorlagenprojektmappe enthält eine funktionsfähige DSL, die Sie ändern oder direkt verwenden können.

Drücken Sie F5 oder STRG+F5, um die Projektmappe zu testen. Eine neue Instanz von Visual Studio wird im Testmodus gestartet.

Öffnen Sie in der neuen Instanz von Visual Studio im Projektmappen-Explorer die "Sample"-Datei. Sie wird als Diagramm mit einem Werkzeugkasten geöffnet.

Bei Ausführung einer Projektmappe, die Sie von der Vorlage Minimale Sprache erstellt haben, gleicht die experimentelle Visual Studio-Instanz folgendem Beispiel:

DSL_min

Experimentieren Sie mit den Werkzeugen. Erstellen Sie Elemente, und verbinden Sie sie.

Schließen Sie die experimentelle Instanz von Visual Studio.

Hinweis

Wenn Sie die DSL geändert haben, können Sie die Formen in der "Sample"-Testdatei nicht mehr sehen.Sie können aber neue Elemente erstellen.

Ändern der Vorlagen-DSL

Benennen Sie einige oder alle Domänenklassen und Formklassen der Vorlagen-DSL-Definition um, und behalten Sie sie bei. Die neuen Klassennamen sollten gültige CLR-Namen ohne Leerzeichen oder Interpunktionszeichen sein.

Die Beibehaltung der folgenden Klassen ist besonders sinnvoll:

  • Die Stammklasse erscheint oben links im DSL-Definitionsdiagramm unter Klassen und Beziehungen. Benennen Sie sie in einen von der DSL verschiedenen Namen um. Eine DSL namens "Musikbibliothek" könnte z. B. eine Stammklasse "Musik" haben.

  • Die Diagrammklasse erscheint unten rechts im DSL-Definitionsdiagramm in der Spalte Diagrammelemente. Möglicherweise müssen Sie einen Bildlauf nach rechts durchführen, um sie zu sehen. Sie hat üblicherweise den Namen IhreDslDiagramm.

  • Wenn Sie die Vorlage Aufgabenfluss verwendet haben und Diagramme mit Verantwortlichkeitsbereichen erstellen möchten, sollten Sie die Actor-Domänenklasse und die ActorSwimlane-Form beibehalten und umbenennen.

Löschen Sie andere Klassen nach Bedarf, oder benennen Sie sie um.

Muster zum Definieren einer DSL

Es ist empfehlenswert, beim Entwickeln einer DSL nur jeweils ein oder zwei Features gleichzeitig hinzuzufügen bzw. anzupassen. Fügen Sie ein Feature hinzu, führen Sie die DSL aus und testen Sie sie. Fügen Sie dann ein oder zwei weitere Features hinzu. Ein typisches Feature Ihrer DSL könnte folgendermaßen aussehen:

  • Eine Domänenklasse, die einbettende Beziehung, die das Element mit dem Modell verbindet, die erforderliche Form zum Anzeigen von Elementen der Klasse im Diagramm sowie das Elementwerkzeug, mit dem Benutzer Elemente erstellen können.

  • Die Domäneneigenschaften einer Domänenklasse und die Decorator-Elemente, die sie in einer Form anzeigen.

  • Eine Verweisbeziehung und der Konnektor, der sie im Diagramm anzeigt, sowie das Konnektorwerkzeug, mit dem Benutzer Verbindungen erstellen können.

  • Eine Anpassung, die Programmcode erfordert, wie z. B. eine Validierungseinschränkung oder ein Menübefehl.

In den folgenden Abschnitten wird die Erstellung der nützlichsten DSL-Features beschrieben. Es gibt viele andere Muster, nach denen eine DSL erstellt werden kann, aber die folgenden sind die gängigsten.

Hinweis

Denken Sie nach dem Hinzufügen eines Features daran, in der Symbolleiste des Projektmappen-Explorers auf Alle Vorlagen transformieren zu klicken, bevor Sie die DSL erstellen und ausführen.

In der folgenden Abbildung sind die Klassen und Beziehungen der DSL dargestellt, die in diesem Thema als Beispiel verwendet wird.

Einbetten von und Verweisen auf Beziehungen

Die nächste Abbildung zeigt ein Beispielmodell dieser DSL:

Instanzmodell für generierte DSL

Hinweis

"Modell" bezieht sich auf eine Instanz Ihrer DSL, die Benutzer erstellen. Sie wird üblicherweise als Diagramm dargestellt.In diesem Thema werden das DSL-Definitionsdiagramm und die Modelldiagramme erläutert, die bei Verwendung der DSL angezeigt werden.

Definieren von Domänenklassen

Domänenklassen stellen die Konzepte der DSL dar. Die Instanzen sind Modellelemente. In einer DSL "Musikbibliothek" verwenden Sie beispielsweise Domänenklassen wie "Album" und "Song".

Zum Erstellen einer Domänenklasse ziehen Sie das Werkzeug Benannte Domänenklasse in das Diagramm und benennen die Klasse dann um.

Weitere Informationen finden Sie unter Properties of Domain Classes.

Erstellen einer einbettenden Beziehung für jede Domänenklasse

Jede Domänenklasse mit Ausnahme der Stammklasse muss Ziel mindestens einer einbettenden Beziehung sein, oder sie muss von einer Klasse erben, die Ziel einer einbettenden Beziehung ist.

Jedes Modellelement in einem Modell ist ein Knoten in einer einzelnen Struktur einbettender Beziehungen. Quelle und Ziel einer einbettenden Beziehung werden häufig als übergeordnetes und untergeordnetes Element bezeichnet.

Die Auswahl eines übergeordneten Elements für eine Domänenklasse hängt davon ab, wie die Lebensdauer ihrer Elemente von anderen Elementen abhängen soll. Wenn ein Knoten einer Struktur gelöscht wird, wird auch seine Unterstruktur gelöscht. Daher werden Klassen von Elementen, deren Existenz nicht von anderen abhängt, direkt unter der Stammklasse eingebettet.

Wenn Sie ein Element innerhalb eines anderen Elements anzeigen, möchten Sie normalerweise eine Besitzerbeziehung darstellen. In diesem Fall wird als übergeordnete Klasse am besten die Klasse des Containers gewählt. Dies gilt jedoch nicht, wenn das in einem Container dargestellte Element tatsächlich nur ein Verweislink auf ein unabhängiges Element ist. In diesem Fall wird beim Löschen des Containers der Verweis gelöscht, aber nicht sein Ziel.

In den hier beschriebenen DSL-Definitionsmustern wird vorausgesetzt, dass beim Löschen eines Containers die in dem Container dargestellten Elemente ebenfalls gelöscht werden. Komplexere Schemas können durch Definieren von Regeln erzielt werden.

Darstellung des Elements

Übergeordnete (einbettende) Klasse

Beispiel in DSL-Projektmappenvorlage

Form im Diagramm

Verantwortlichkeitsbereich

Stammklasse der DSL

Minimale Sprache

Aufgabenfluss: Actor-Klasse

Form in Verantwortlichkeitsbereich

Domänenklasse von Elementen, die als Verantwortlichkeitsbereiche dargestellt werden.

Aufgabenfluss: Task-Klasse

Element in Liste in Form, das zusammen mit Container gelöscht wird.

Anschluss am Rand einer Form

Der Containerform zugeordnete Domänenklasse

Klassendiagramm: Attribute-Klasse

Komponentendiagramm: Port-Klasse

Element in Liste, nicht zusammen mit Container gelöscht

Stammklasse der DSL

Die Liste enthält Verweislinks.

Nicht direkt angezeigt

Die Klasse, von der es Bestandteil ist

Im Beispiel "Musikbibliothek" werden Alben als Rechtecke dargestellt, in denen die Titel von Songs aufgelistet sind. Daher ist das übergeordnete Element von "Album" die Stammklasse "Musik", und das übergeordnete Element von "Song" ist "Album".

Um eine Domänenklasse und ihre Einbettung gleichzeitig zu erstellen, klicken Sie auf das Werkzeug Einbettende Beziehung, dann auf die übergeordnete Klasse und anschließend auf einen leeren Bereich des Diagramms.

In der Regel müssen Sie den Namen der einbettenden Beziehung und ihrer Rollen nicht anpassen, da automatisch die Klassennamen verwendet werden.

Weitere Informationen finden Sie unter Properties of Domain Relationships und Properties of Domain Roles.

Hinweis

Einbettung ist nicht identisch mit Vererbung.Die untergeordneten Elemente in einer einbettenden Beziehung erben keine Features von ihren übergeordneten Elementen.

Hinzufügen von Domäneneigenschaften zu den einzelnen Domänenklassen

In Domäneneigenschaften werden Werte gespeichert. Beispiele: Name, Titel, Veröffentlichungsdatum.

Klicken Sie in der Klasse auf Domäneneigenschaften, drücken Sie die EINGABETASTE, und geben Sie dann den Namen einer Eigenschaft ein. Der Standardtyp einer Domäneneigenschaft lautet String. Wenn Sie den Typ ändern möchten, wählen Sie die Domäneneigenschaft aus, und legen Sie Typ im Fenster Eigenschaften fest. Befindet sich der gewünschte Typ nicht in der Dropdownliste, lesen Sie unter Hinzufügen von Eigenschaftentypen nach.

Legen Sie eine Eigenschaft als Elementnamen fest. Wählen Sie eine Domäneneigenschaft aus, mit der Elemente im Sprach-Explorer identifiziert werden können. Beispielsweise könnten Sie in der "Song"-Domänenklasse die "Titel"-Domäneneigenschaft auswählen. Legen Sie im Fenster Eigenschaften die Option Ist Elementname auf true fest.

Erstellen abgeleiteter Domänenklassen

Soll eine Domänenklasse Varianten aufweisen, die ihre Eigenschaften und Beziehungen erben, erstellen Sie von der Domänenklasse abgeleitete Klassen. "Album" könnte z. B. die abgeleiteten Klassen WMA und MP3 haben.

Erstellen Sie die abgeleitete Klasse mit dem Werkzeug Domänenklasse.

Klicken Sie auf das Werkzeug Vererbung, auf die abgeleitete Klasse und dann auf die Basisklasse.

Unter Umständen ist es sinnvoll, den Vererbungsmodifizierer der Basisklasse auf abstrakt festzulegen. Wenn Sie voraussichtlich Instanzen der Basisklasse benötigen, können Sie stattdessen eine gesonderte abgeleitete Klasse für diese erstellen.

Abgeleitete Klassen erben die Eigenschaften und Rollen ihrer Basisklassen.

Bereinigen des DSL-Definitionsdiagramms

Wenn Sie Beziehungen hinzufügen, erscheinen einige Klassen an mehreren Stellen. Um die Anzahl der Darstellungen zu verringern und das Diagramm breiter zu machen, klicken Sie mit der rechten Maustaste auf die Zielklasse einer Beziehung, und klicken Sie dann auf Struktur hier anzeigen. Für den umgekehrten Effekt klicken Sie mit der rechten Maustaste auf die Zielklasse einer Beziehung, und klicken Sie dann auf Struktur aufteilen. Wenn diese Menübefehle nicht angezeigt werden, vergewissern Sie sich, dass nur die Domänenklasse ausgewählt ist.

Verwenden Sie STRG+NACH OBEN und STRG+NACH UNTEN, um Domänenklassen und Formklassen zu verschieben.

Testen der Domänenklassen

So testen Sie die neuen Domänenklassen

  1. Klicken Sie auf "Alle Vorlagen transformieren" in der Symbolleiste des Projektmappen-Explorers, um den DSL-Designercode zu generieren. Dieser Schritt kann automatisiert werden. Weitere Informationen finden Sie unter So automatisieren Sie die Transformation aller Vorlagen.

  2. Erstellen Sie die DSL, und führen Sie sie aus. Drücken Sie F5 oder STRG+F5, um eine neue Instanz von Visual Studio im experimentellen Modus auszuführen. Öffnen oder erstellen Sie in der experimentellen Instanz von Visual Studio eine Datei mit der Dateinamenerweiterung Ihrer DSL.

  3. Öffnen Sie den Explorer. Neben dem Diagramm befindet sich das Sprach-Explorer-Fenster, üblicherweise mit dem Namen IhreSprache-Explorer. Sollten Sie das Fenster nicht sehen, befindet es sich möglicherweise auf einer Registerkarte unter dem Projektmappen-Explorer. Wenn Sie es nicht finden, zeigen Sie im Menü Ansicht auf Weitere Fenster, und klicken Sie dann auf IhreSprache-Explorer.

    Im Explorer wird eine Strukturansicht des Modells dargestellt.

  4. Erstellen Sie neue Elemente. Klicken Sie mit der rechten Maustaste auf den Stammknoten oben in der Struktur, und klicken Sie dann auf Neu hinzufügen IhreKlasse.

    Im Sprach-Explorer wird eine neue Instanz Ihrer Klasse angezeigt.

  5. Überprüfen Sie beim Erstellen neuer Instanzen, ob jede Instanz einen anderen Namen hat. Dies ist nur der Fall, wenn Sie das Flag Ist Elementname für eine Domäneneigenschaft gesetzt haben.

  6. Untersuchen Sie die Domäneneigenschaften. Wählen Sie eine Instanz Ihrer Klasse aus, und betrachten Sie das Eigenschaftenfenster. Es sollte die Domäneneigenschaften zeigen, die Sie für die Domänenklasse definiert haben.

  7. Speichern Sie die Datei, schließen Sie sie, und öffnen Sie sie erneut. Nachdem Sie die Knoten erweitert haben, sollten alle erstellten Instanzen im Explorer sichtbar sein.

Definieren von Formen im Diagramm

Sie können Klassen von Elementen definieren, die in einem Diagramm als Rechtecke, Ellipsen oder Symbole erscheinen.

So definieren Sie eine Klasse von Elementen, die in einem Diagramm als Formen dargestellt werden

  1. Definieren und testen Sie eine Domänenklasse, wie im Abschnitt Definieren von Domänenklassen beschrieben.

    • Das übergeordnete Element der Klasse sollte die Stammklasse sein. Es sollte also eine einbettende Beziehung zwischen der Stammklasse und der neuen Domänenklasse bestehen.

    • Wenn das Diagramm Verantwortlichkeitsbereiche enthält, kann das übergeordnete Element die Domänenklasse sein, die einem Verantwortlichkeitsbereich zugeordnet ist. Lesen Sie den Abschnitt Definieren einer DSL mit Verantwortlichkeitsbereichen, bevor Sie das Verfahren fortsetzen.

  2. Fügen Sie eine Formklasse hinzu, um die Elemente im Modelldiagramm darzustellen. Ziehen Sie eines der folgenden Werkzeuge in das DSL-Definitionsdiagramm:

    • Geometrieform erstellt ein Rechteck oder eine Ellipse.

    • Bild-Form zeigt ein von Ihnen bereitgestelltes Bild an.

    • Depot-Form stellt ein Rechteck dar, das mindestens eine Liste von Elementen enthält.

    Benennen Sie die Formklasse um, die rechts im DSL-Definitionsdiagramm unter "Formen und Konnektoren" angezeigt wird.

  3. Definieren Sie ein Bild, falls Sie eine Bild-Form erstellt haben.

    1. Erstellen Sie eine Bilddatei beliebiger Größe. Die Formate BMP, JPEG, GIF und EMF werden unterstützt.

    2. Fügen Sie die Datei im Projektmappen-Explorer der Projektmappe unter Dsl\Ressourcen hinzu.

    3. Kehren Sie zum DSL-Definitionsdiagramm zurück, und wählen Sie die neue Bild-Formklasse aus.

    4. Klicken Sie im Eigenschaftenfenster auf die Eigenschaft Bild.

    5. Klicken Sie im Dialogfeld Bild auswählen auf das Dropdownmenü unter Dateiname, und wählen Sie das Bild aus.

  4. Fügen Sie der Form Text-Decorator-Elemente hinzu, um die Domäneneigenschaften anzuzeigen.

    Sie benötigen wahrscheinlich mindestens ein Text-Decorator-Element, um den Namen oder Titel des Modellelements anzuzeigen.

    Klicken Sie mit der rechten Maustaste auf den Header der Formklasse, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Text-Decorator. Legen Sie den Namen des Decorator-Elements fest, und legen Sie im Eigenschaftenfester seine Position fest.

  5. Verbinden Sie jede Form mithilfe einer Diagrammelementzuordnung mit der Domänenklasse, die sie anzeigen soll.

    Klicken Sie auf das Werkzeug Diagrammelementzuordnung, auf die Domänenklasse und dann auf die Formklasse.

  6. Ordnen Sie die Eigenschaften der Text-Decorator-Elemente zu.

    1. Wählen Sie die graue Linie zwischen der Domänenklasse und der Formklasse aus, die die Diagrammelementzuordnung darstellt.

    2. Klicken Sie im Fenster DSL-Details auf die Registerkarte Decorator-Zuordnungen. Wird das Fenster DSL-Details nicht angezeigt, zeigen Sie im Menü Ansicht auf Weitere Fenster, und klicken Sie dann auf DSL-Details. Häufig muss der obere Rand des Fensters angehoben werden, um den gesamten Inhalt anzuzeigen.

    3. Wählen Sie den Namen eines Decorator-Elements aus. Wählen Sie unter Anzeigeeigenschaft den Namen einer Eigenschaft der Domänenklasse aus. Wiederholen Sie dies für jedes Decorator-Element.

      Wenn Sie eine Eigenschaft eines verwandten Elements anzeigen möchten, klicken Sie auf den Dropdown-Strukturnavigator unter Pfad zur Anzeigeeigenschaft.

    4. Stellen Sie sicher, dass neben jedem Decorator-Namen ein Häkchen angezeigt wird.

    Formzuordnungen und DSL-Detailfenster

  7. Erstellen Sie ein Werkzeugkastenelement zum Erstellen von Elementen der Domänenklasse.

    1. Erweitern Sie in DSL-Explorer den Knoten Editor und alle zugehörigen Unterknoten.

    2. Klicken Sie mit der rechten Maustaste auf den Knoten unter Werkzeugkasten-Registerkarten, der denselben Namen wie Ihre DSL hat, z. B. "Musikbibliothek". Klicken Sie auf Elementwerkzeug hinzufügen.

      Hinweis

      Wenn Sie mit der rechten Maustaste auf den Knoten Werkzeuge klicken, wird Elementwerkzeug hinzufügen nicht angezeigt.Klicken Sie stattdessen auf den übergeordneten Knoten.

    3. Legen Sie im Eigenschaftenfenster, während das Werkzeug für neue Elemente ausgewählt ist, Klasse auf die kürzlich hinzugefügte Domänenklasse fest.

    4. Legen Sie Beschriftung und QuickInfo fest.

    5. Legen Sie Werkzeugkastensymbol auf ein Symbol fest, das im Werkzeugkasten angezeigt wird. Sie können ein neues Symbol oder ein bereits für ein anderes Werkzeug verwendetes Symbol angeben.

      Um ein neues Symbol zu erstellen, öffnen Sie Dsl\Ressourcen im Projektmappen-Explorer. Kopieren Sie eine der vorhandenen BMP-Dateien für Elementwerkzeuge, und fügen Sie sie ein. Benennen Sie die eingefügte Kopie um, und doppelklicken Sie dann darauf, um sie zu öffnen.

      Kehren Sie zum DSL-Definitionsdiagramm zurück, wählen Sie das Werkzeug aus, und klicken Sie im Eigenschaftenfenster in Werkzeugkastensymbol auf [...]. Wählen Sie im Dialogfeld Bitmap auswählen Ihre BMP-Datei aus dem Dropdownmenü aus.

Weitere Informationen finden Sie unter Properties of Geometry Shapes und Properties of Image Shapes.

So testen Sie Formen

  1. Klicken Sie auf "Alle Vorlagen transformieren" in der Symbolleiste des Projektmappen-Explorers, um den DSL-Designercode zu generieren.

  2. Erstellen Sie die DSL, und führen Sie sie aus. Drücken Sie F5 oder STRG+F5, um eine neue Instanz von Visual Studio im experimentellen Modus auszuführen. Öffnen oder erstellen Sie in der experimentellen Instanz von Visual Studio eine Datei mit der Dateinamenerweiterung Ihrer DSL.

  3. Überprüfen Sie, ob die Elementwerkzeuge im Werkzeugkasten erscheinen.

  4. Erstellen Sie Formen, indem Sie ein Werkzeug in das Modelldiagramm ziehen.

  5. Überprüfen Sie, ob alle Text-Decorator-Elemente angezeigt werden und ob Folgendes der Fall ist:

    1. Sie können sie bearbeiten, es sei denn, Sie haben das Flag Ist schreibgeschützte Benutzeroberfläche für die Domäneneigenschaft aktiviert.

    2. Wenn Sie die Eigenschaft im Eigenschaftenfenster oder im Decorator bearbeiten, wird die jeweils andere Ansicht aktualisiert.

Nach dem ersten Test einer Form möchten Sie unter Umständen einige Eigenschaften anpassen und erweiterte Features hinzufügen. Weitere Informationen finden Sie unter Customizing and Extending a Domain-Specific Language.

Definieren von Verweisbeziehungen

Sie können eine Verweisbeziehung zwischen einer Quelldomänenklasse und einer Zieldomänenklasse definieren. Verweisbeziehungen werden in einem Diagramm üblicherweise als Konnektoren, also als Linien zwischen Formen, angezeigt.

Wenn beispielsweise Alben und Interpreten als Formen in einem Diagramm dargestellt werden, könnten Sie eine Beziehung namens "ArtistsAppearedOnAlbums" definieren, die Interpreten mit den Alben verknüpft, an denen sie mitgewirkt haben. Siehe das Beispiel in der Abbildung.

Instanzmodell für generierte DSL

Verweisbeziehungen können auch Elemente desselben Typs verbinden. So ist in einer DSL, die einen Familienstammbaum darstellt, die Beziehung zwischen Eltern und Kindern eine Verweisbeziehung von Person zu Person.

Definieren einer Verweisbeziehung

Klicken Sie auf das Werkzeug "Verweisbeziehung", auf die Quelldomänenklasse der Beziehung und dann auf die Zieldomänenklasse. Die Zielklasse kann mit der Quellklasse übereinstimmen.

Jede Beziehung hat zwei Rollen, die durch die Linien auf beiden Seiten des Beziehungsfelds dargestellt werden. Sie können jede Rolle auswählen und ihre Eigenschaften im Eigenschaftenfenster festlegen.

Erwägen Sie, die Rollen umzubenennen. In einer Beziehung zwischen Personen könnten Sie z. B. die Standardnamen in Eltern und Kinder, Manager und Mitarbeiter, Lehrer und Schüler usw. ändern.

Passen Sie ggf. die Multiplizität der einzelnen Rollen an. Soll jede Person höchstens einen Manager haben, legen Sie die Multiplizität (unter der Beschriftung "Manager") im Diagramm auf 0..1 fest.

Fügen Sie der Beziehung Domäneneigenschaften hinzu. In der Abbildung hat die Beziehung zwischen Interpret und Album eine Eigenschaft "Rolle".

Legen Sie die Allows Duplicates-Eigenschaft der Beziehung fest, wenn zwischen demselben Paar von Modellelementen mehrere Links derselben Klasse vorhanden sein können. Beispielsweise könnten Sie zulassen, dass ein Lehrer einen Schüler in mehreren Fächern unterrichtet.

Formzuordnungen für Verbindungen

Weitere Informationen finden Sie unter Properties of Domain Relationships und Properties of Domain Roles.

Definieren eines Konnektors zur Darstellung der Beziehung

Ein Konnektor stellt eine Linie zwischen zwei Formen im Modelldiagramm dar.

Ziehen Sie das Werkzeug Konnektor in das DSL-Definitionsdiagramm.

Fügen Sie Text-Decorator-Elemente hinzu, falls Beschriftungen auf dem Konnektor angezeigt werden sollen. Legen Sie deren Positionen fest. Soll der Benutzer einen Text-Decorator verschieben können, legen Sie die Ist verschiebbar-Eigenschaft fest.

Verwenden Sie das Werkzeug Diagrammelementzuordnung, um den Konnektor mit der Verweisbeziehung zu verknüpfen.

Öffnen Sie, während die Diagrammelementzuordnung ausgewählt ist, das Fenster DSL-Details und dann die Registerkarte Decorator-Zuordnungen.

Wählen Sie jeden einzelnen Decorator aus, und legen Sie Anzeigeeigenschaft auf die richtige Domäneneigenschaft fest.

Stellen Sie sicher, dass neben jedem Element der Liste Decorator-Elemente ein Häkchen angezeigt wird.

Definieren eines Werkzeugs "Verbindungs-Generator"

Erweitern Sie im Fenster DSL-Explorer den Knoten Editor und alle zugehörigen Unterknoten.

Klicken Sie mit der rechten Maustaste auf den Knoten mit dem Namen Ihrer DSL, und klicken Sie dann auf Neues Verbindungswerkzeug hinzufügen.

Führen Sie, während das neue Werkzeug ausgewählt ist, im Eigenschaftenfenster Folgendes aus:

  • Legen Sie Beschriftung und QuickInfo fest.

  • Klicken Sie auf Verbindungs-Generator, und wählen Sie den geeigneten Generator für die neue Beziehung aus.

  • Legen Sie Werkzeugkastensymbol auf das Symbol fest, das im Werkzeugkasten angezeigt werden soll. Sie können ein neues Symbol oder ein bereits für ein anderes Werkzeug verwendetes Symbol angeben.

    Um ein neues Symbol zu erstellen, öffnen Sie Dsl\Ressourcen im Projektmappen-Explorer. Kopieren Sie eine der vorhandenen BMP-Dateien für Elementwerkzeuge, und fügen Sie sie ein. Benennen Sie die eingefügte Kopie um, und doppelklicken Sie dann darauf, um sie zu öffnen.

    Kehren Sie zum DSL-Definitionsdiagramm zurück, wählen Sie das Werkzeug aus, und klicken Sie im Eigenschaftenfenster in Werkzeugkastensymbol auf [...]. Wählen Sie im Dialogfeld Bitmap auswählen Ihre BMP-Datei aus dem Dropdownmenü aus.

So testen Sie eine Verweisbeziehung und einen Konnektor

  1. Klicken Sie auf "Alle Vorlagen transformieren" in der Symbolleiste des Projektmappen-Explorers, um den DSL-Designercode zu generieren.

  2. Erstellen Sie die DSL, und führen Sie sie aus. Drücken Sie F5 oder STRG+F5, um eine neue Instanz von Visual Studio im experimentellen Modus auszuführen. Öffnen oder erstellen Sie in der experimentellen Instanz von Visual Studio eine Datei mit der Dateinamenerweiterung Ihrer DSL.

  3. Überprüfen Sie, ob das Verbindungswerkzeug im Werkzeugkasten erscheint.

  4. Erstellen Sie Formen, indem Sie ein Werkzeug in das Modelldiagramm ziehen.

  5. Erstellen Sie Verbindungen zwischen den Formen. Klicken Sie auf das Konnektorwerkzeug, auf eine Form und dann auf eine andere Form.

  6. Überprüfen Sie, ob Sie keine Verbindungen zwischen ungeeigneten Klassen erstellen können. Besteht die Beziehung beispielsweise zwischen Alben und Interpreten, überprüfen Sie, ob Sie nicht Interpreten mit Interpreten verbinden können.

  7. Überprüfen Sie, ob die Multiplizitäten zutreffend sind. Überprüfen Sie beispielsweise, ob Sie nicht eine Person mit mehreren Managern verbinden können.

  8. Überprüfen Sie, ob alle Text-Decorator-Elemente angezeigt werden und ob Folgendes der Fall ist:

    1. Sie können sie bearbeiten, es sei denn, Sie haben das Flag Ist schreibgeschützte Benutzeroberfläche für die Domäneneigenschaft aktiviert.

    2. Wenn Sie die Eigenschaft im Eigenschaftenfenster oder im Decorator bearbeiten, wird die jeweils andere Ansicht aktualisiert.

Nach dem ersten Test eines Konnektors möchten Sie unter Umständen einige Eigenschaften anpassen und erweiterte Features hinzufügen. Weitere Informationen finden Sie unter Customizing and Extending a Domain-Specific Language.

Definieren von Formen, die Listen enthalten: Depot-Formen

Eine Depot-Form enthält mindestens eine Liste von Elementen. In einer DSL für eine Musikbibliothek würden Sie z. B. Depot-Formen verwenden, um Musikalben darzustellen. Jedes Album enthält eine Liste von Songs.

Depot-Form

Am einfachsten erzielen Sie diesen Effekt in einer DSL-Definition, indem Sie eine Domänenklasse für den Container und eine Domänenklasse für jede Liste definieren. Die Containerklasse wird der Depot-Form zugeordnet.

Formzuordnung

Weitere Informationen finden Sie unter Properties of Compartment Shapes.

So definieren Sie eine Depot-Form

  1. Erstellen Sie die Domänenklasse für den Container. Klicken Sie auf das Werkzeug Einbettende Beziehung, auf die Stammklasse des Modells und dann auf einen leeren Bereich des DSL-Definitionsdiagramms. Dadurch wird in der Beispielabbildung die Domänenklasse namens "Album" erstellt.

    Alternativ können Sie den Container statt in die Stammklasse auch in eine Domänenklasse einbetten, die einem Verantwortlichkeitsbereich zugeordnet ist.

    Fügen Sie der Klasse eine Domäneneigenschaft wie "Name" hinzu, und setzen Sie im Eigenschaftenfenster das zugehörige Flag Ist Elementname.

  2. Erstellen Sie die Domänenklasse für die Listenelemente. Klicken Sie auf das Werkzeug Einbettende Beziehung, auf die Containerklasse (Album) und dann auf einen leeren Bereich des Diagramms. Dadurch wird in der Beispielabbildung die Domänenklasse namens "Song" erstellt.

    Fügen Sie der Klasse eine Domäneneigenschaft wie "Titel" hinzu, und setzen Sie das zugehörige Flag Ist Elementname.

    Fügen Sie weitere Domäneneigenschaften hinzu.

    Fügen Sie eine weitere Domänenklasse für Listenelemente jeder Liste hinzu, die Sie anzeigen möchten.

  3. Um mehrere Elementtypen in der Liste zu mischen, erstellen Sie Klassen, die von der Listenklasse erben. Machen Sie die Listenklasse abstrakt, indem Sie den zugehörigen Vererbungsmodifizierer festlegen.

    Möchten Sie beispielsweise klassische Musik nach Komponisten statt nach Interpreten sortieren, könnten Sie zwei Unterklassen von Song erstellen: ClassicalSong und NonClassicalSong.

  4. Erstellen Sie die Depot-Form. Ziehen Sie das Werkzeug Depot-Form in das DSL-Definitionsdiagramm.

    Fügen Sie ein Text-Decorator-Element hinzu, und legen Sie seinen Namen fest.

    Fügen Sie ein Depot hinzu, und legen Sie seinen Namen fest.

  5. Soll der Benutzer die Listendepots ausblenden können, klicken Sie mit der rechten Maustaste auf die Depot-Form-Klasse, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Decorator-Element erweitern/reduzieren. Legen Sie im Eigenschaftenfenster die Position des Decorator-Elements fest.

  6. Klicken Sie auf das Werkzeug Diagrammelementzuordnung, auf die Domänenklasse des Containers und dann auf die Depot-Form.

  7. Wählen Sie den Diagrammelementzuordnungs-Link zwischen der Domänenklasse und der Form aus. Führen Sie im Fenster DSL-Details Folgendes aus:

    1. Klicken Sie auf die Registerkarte Decorator-Elemente. Klicken Sie auf den Namen des Decorator-Elements, und wählen Sie dann das entsprechende Element unter Anzeigeeigenschaft aus. Stellen Sie sicher, dass neben dem Namen des Decorator-Elements ein Häkchen angezeigt wird.

    2. Klicken Sie auf die Registerkarte Depot-Zuordnungen.

      Klicken Sie auf den Namen des Depots.

      Navigieren Sie unter Pfad der angezeigten Elementauflistung zur Listenelementklasse ("Song"). Klicken Sie auf den Dropdownpfeil, um das Navigatorwerkzeug zu verwenden.

      Wählen Sie unter Anzeigeeigenschaft die Eigenschaft aus, die in der Liste angezeigt werden soll. Im Beispiel ist dies "Titel".

Hinweis

Mithilfe der Pfadfelder in der Decorator-Zuordnung und der Depot-Zuordnung können Sie komplexere Beziehungen zwischen der Domänenklasse und der Depot-Form erstellen.

So definieren Sie ein Werkzeug zum Erstellen der Form

  1. Erstellen Sie ein Werkzeugkastenelement zum Erstellen von Elementen der Domänenklasse.

  2. Erweitern Sie in DSL-Explorer den Knoten Editor und alle zugehörigen Unterknoten.

  3. Klicken Sie mit der rechten Maustaste auf den Knoten unter Werkzeugkasten-Registerkarten, der denselben Namen wie Ihre DSL hat, z. B. "Musikbibliothek". Klicken Sie auf Elementwerkzeug hinzufügen.

    Hinweis

    Wenn Sie mit der rechten Maustaste auf den Knoten Werkzeuge klicken, wird Elementwerkzeug hinzufügen nicht angezeigt.Klicken Sie stattdessen auf den übergeordneten Knoten.

  4. Legen Sie im Eigenschaftenfenster, während das Werkzeug für neue Elemente ausgewählt ist, Klasse auf die kürzlich hinzugefügte Domänenklasse fest.

  5. Legen Sie Beschriftung und QuickInfo fest.

  6. Legen Sie Werkzeugkastensymbol auf ein Symbol fest, das im Werkzeugkasten angezeigt wird. Sie können ein neues Symbol oder ein bereits für ein anderes Werkzeug verwendetes Symbol angeben.

    Um ein neues Symbol zu erstellen, öffnen Sie Dsl\Ressourcen im Projektmappen-Explorer. Kopieren Sie eine der vorhandenen BMP-Dateien für Elementwerkzeuge, und fügen Sie sie ein. Benennen Sie die eingefügte Kopie um, und doppelklicken Sie dann darauf, um sie zu öffnen.

    Kehren Sie zum DSL-Definitionsdiagramm zurück, wählen Sie das Werkzeug aus, und klicken Sie im Eigenschaftenfenster in Werkzeugkastensymbol auf [...]. Wählen Sie im Dialogfeld Bitmap auswählen Ihre BMP-Datei aus dem Dropdownmenü aus.

So testen Sie eine Depot-Form

  1. Klicken Sie auf "Alle Vorlagen transformieren" in der Symbolleiste des Projektmappen-Explorers, um den DSL-Designercode zu generieren.

  2. Erstellen Sie die DSL, und führen Sie sie aus. Drücken Sie F5 oder STRG+F5, um eine neue Instanz von Visual Studio im experimentellen Modus auszuführen. Öffnen oder erstellen Sie in der experimentellen Instanz von Visual Studio eine Datei mit der Dateinamenerweiterung Ihrer DSL.

  3. Überprüfen Sie, ob das Werkzeug im Werkzeugkasten erscheint.

  4. Ziehen Sie das Werkzeug in das Modelldiagramm. Eine Form wird erstellt.

    Überprüfen Sie, ob der Name des Elements angezeigt und automatisch auf einen Standardwert festgelegt wird.

  5. Klicken Sie mit der rechten Maustaste auf den Header der neuen Form, und klicken Sie dann auf "IhrListenelement hinzufügen". Im Beispiel lautet der Befehl "Song hinzufügen".

    Überprüfen Sie, ob ein Element mit einem neuen Namen in der Liste erscheint.

  6. Klicken Sie auf eines der Listenelemente, und betrachten Sie das Eigenschaftenfenster. Es sollten die Eigenschaften der Listenelemente angezeigt werden.

  7. Öffnen Sie den Sprach-Explorer. Überprüfen Sie, ob die Containerknoten mit darin enthaltenen Listenelementknoten angezeigt werden.

Generierter Explorer für DSL

Nach dem ersten Test einer Depot-Form möchten Sie unter Umständen einige Eigenschaften anpassen und erweiterte Features hinzufügen. Weitere Informationen finden Sie unter Customizing and Extending a Domain-Specific Language.

Normalerweise ist ein in einem Depot angezeigtes Element ein untergeordnetes Element des Elements, das durch die Depot-Form dargestellt wird. Aber manchmal soll ein Element angezeigt werden, das durch eine Verweisbeziehung damit verbunden ist.

Wir könnten z. B. ein zweites Depot zu AlbumShape hinzufügen, in dem eine Liste der mit dem Album verbundenen Interpreten angezeigt wird.

In diesem Fall sollte das Depot statt des Elements, auf das verwiesen wird, den Link anzeigen. Denn wenn der Benutzer das Element im Depot auswählt und ENTF drückt, soll der Link gelöscht werden und nicht das Element, auf das verwiesen wird.

Dennoch kann der Name des Elements, auf das verwiesen wird, im Depot erscheinen.

Im folgenden Verfahren wird vorausgesetzt, dass Sie bereits die Domänenklasse, die Verweisbeziehung, die Depot-Form und die Diagrammelementzuordnung erstellt haben, wie weiter oben in diesem Abschnitt beschrieben.

  1. Fügen Sie der Depot-Form ein Depot hinzu. Klicken Sie im DSL-Definitionsdiagramm mit der rechten Maustaste auf die Depot-Form, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Depot.

  2. Legen Sie Pfad der angezeigten Elementauflistung fest, um zu dem Link statt zu seinem Zielelement zu navigieren. Klicken Sie auf das Dropdownmenü, und verwenden Sie die Strukturansicht, um die Verweisbeziehung statt ihres Ziels auszuwählen. Im Beispiel lautet die Beziehung "ArtistAppearedOnAlbums".

  3. Legen Sie Pfad zur Anzeigeeigenschaft fest, um von dem Link zum Zielelement zu navigieren. Im Beispiel ist dies "Interpret".

  4. Legen Sie Anzeigeeigenschaft auf die entsprechende Eigenschaft des Zielelements fest, z. B. "Name".

  5. Transformieren Sie alle Vorlagen, erstellen Sie die DSL und führen Sie sie aus, und öffnen Sie dann ein Testmodell.

  6. Erstellen Sie in dem Modelldiagramm die entsprechenden Formklassen, legen Sie ihre Namen fest, und erstellen Sie einen Link zwischen ihnen. In der Depot-Form sollten die Namen der verbundenen Elemente angezeigt werden.

  7. Wählen Sie entweder den Link oder das Element in der Depot-Form aus. Sowohl der Link als auch das Element sollte angezeigt werden.

Definieren von Anschlüssen am Rand einer anderen Form

Ein Anschluss ist eine Form, die sich am Rand einer anderen Form befindet.

Anschlüsse können auch verwendet werden, um einen festen Verbindungspunkt an einer anderen Form bereitzustellen, zu dem der Benutzer Konnektoren zeichnen kann. In diesem Fall können Sie die Anschluss-Form transparent machen.

Wenn Sie ein Beispiel mit Anschlüssen sehen möchten, wählen Sie beim Erstellen einer neuen DSL-Projektmappe die Vorlage Komponentendiagramm aus. Dieses Beispiel zeigt die wesentlichen Punkte, die Sie bei der Definition von Anschlüssen berücksichtigen können:

  • Es gibt eine Domänenklasse, die den Container der Anschlüsse darstellt: Component.

  • Es gibt eine Domänenklasse, die Anschlüsse darstellt. Im Beispiel ist dies ComponentPort.

  • Es gibt eine einbettende Beziehung von der Container-Domänenklasse zur Anschluss-Domänenklasse. Weitere Informationen finden Sie unter Definieren von Domänenklassen.

  • Wenn verschiedene Anschlusstypen in demselben Container gemischt werden sollen, können Sie Unterklassen der Anschluss-Domänenklasse erstellen. In dem Beispiel erben InPort und OutPort von ComponentPort.

  • Die Container-Domänenklasse kann jeder beliebigen Form zugeordnet werden. Im Beispiel ist dies ComponentShape. Weitere Informationen finden Sie unter Definieren von Formen.

  • Die Anschluss-Domänenklassen werden Anschluss-Formen zugeordnet. Sie können entweder die abgeleiteten Klassen verschiedenen Anschluss-Formklassen zuordnen oder die Basisklasse einer Anschluss-Formklasse zuordnen.

Ansonsten verhalten sich Anschluss-Formen wie im Abschnitt Definieren von Formen beschrieben.

Weitere Informationen finden Sie unter Properties of Port Shapes.

Definieren einer DSL mit Verantwortlichkeitsbereichen

Verantwortlichkeitsbereiche sind vertikale oder horizontale Bereiche eines Diagramms. Jeder Verantwortlichkeitsbereich entspricht einem Modellelement. Ihre DSL-Definition muss eine Domänenklasse für die Verantwortlichkeitsbereich-Elemente enthalten.

Am besten lässt sich eine DSL mit Verantwortlichkeitsbereichen erstellen, indem Sie eine neue DSL-Projektmappe erstellen und die Projektmappenvorlage "Aufgabenfluss" auswählen. In der DSL-Definition ist die Actor-Klasse die Domänenklasse, die dem Verantwortlichkeitsbereich zugeordnet wird. Benennen Sie diese und die anderen Klassen nach den Anforderungen Ihres Projekts um.

Um eine Klasse hinzuzufügen, die als Form innerhalb eines Verantwortlichkeitsbereichs angezeigt wird, erstellen Sie eine einbettende Beziehung zwischen der Klasse des Verantwortlichkeitsbereichs und Ihrer neuen Klasse. Benutzer können Elemente von einem Verantwortlichkeitsbereich in einen anderen ziehen, aber jedes Element befindet sich immer innerhalb eines bestimmten Verantwortlichkeitsbereichs. In der Projektmappenvorlage "Aufgabenfluss" ist "FlowElement" ein untergeordnetes Element der Verantwortlichkeitsbereich-Klasse.

Um eine Klasse hinzuzufügen, die als Form unabhängig von Verantwortlichkeitsbereichen angezeigt wird, erstellen Sie eine einbettende Beziehung zwischen der Stammklasse und Ihrer neuen Klasse. Benutzer können diese Formen beliebig im Diagramm platzieren, auch über die Grenzen von Verantwortlichkeitsbereichen hinweg und außerhalb von Verantwortlichkeitsbereichen. In der Projektmappenvorlage "Aufgabenfluss" ist "Comment" ein untergeordnetes Element der Stammklasse.

Weitere Informationen finden Sie unter Properties of Swimlanes.

Hinzufügen von Eigenschaftentypen

Domänenenumerationen und Literale

Eine Domänenenumeration ist ein Typ mit mehreren Literalwerten.

Um eine Domänenenumeration hinzuzufügen, klicken Sie in DSL-Explorer mit der rechten Maustaste auf den Stamm des Modells, und klicken Sie dann auf Neue Domänenenumeration hinzufügen. Das Element erscheint in DSL-Explorer unter dem Knoten Domänentypen. Das Element erscheint nicht im Diagramm.

Um der Domänenenumeration Enumerationsliterale hinzuzufügen, klicken Sie in DSL-Explorer mit der rechten Maustaste auf die Domänenenumeration, und klicken Sie dann auf Neues Enumerationsliteral hinzufügen.

Eine Eigenschaft, die einen Enumerationstyp besitzt, kann standardmäßig jeweils nur auf einen Wert der Enumeration festgelegt werden. Sollen Benutzer und Programmierer eine beliebige Kombination von Werten festlegen können (ein Bitfeld), legen Sie die Eigenschaft IsFlags der Enumeration fest.

Externe Typen

Wenn Sie beim Festlegen des Typs einer Domäneneigenschaft den gewünschten Typ nicht in der Dropdownliste Typ finden, können Sie einen externen Typ hinzufügen. Sie könnten der Liste beispielsweise den Typ System.Drawing.Color hinzufügen.

Um einen Typ hinzuzufügen, klicken Sie in DSL-Explorer mit der rechten Maustaste auf den Stamm des Modells, und klicken Sie dann auf Neuen externen Typ hinzufügen. Legen Sie im Eigenschaftenfenster den Namen auf Color und den Namespace auf System.Drawing fest. Der Typ erscheint nun in DSL-Explorer unter Domänentypen. Sie können ihn immer auswählen, wenn Sie den Typ einer Domäneneigenschaft festlegen.

Anpassen der DSL

Mit den hier beschriebenen Verfahren können Sie schnell eine DSL mit einer Diagrammdarstellung, einem lesbaren XML-Format und den grundlegenden Tools erstellen, mit denen Code und andere Artefakte generiert werden.

Die DSL-Definition kann auf zwei Arten erweitert werden:

  1. Optimieren Sie die DSL, indem Sie weitere Features in der DSL-Definition verwenden. Sie können beispielsweise ein einzelnes Konnektorwerkzeug erstellen, das verschiedene Typen von Konnektoren generieren kann, und Sie können die Regeln steuern, nach denen beim Löschen eines Elements auch verwandte Elemente gelöscht werden. Diese Verfahren bestehen meist im Festlegen von Werten in der DSL-Definition. Manche erfordern auch einige Zeilen Programmcode.

    Weitere Informationen finden Sie unter Customizing and Extending a Domain-Specific Language.

  2. Erweitern Sie Ihre Modellierungstools mit Programmcode, um kompliziertere Effekte zu erzielen. So können Sie z. B. Menübefehle erstellen, die das Modell ändern, und Sie können Tools erstellen, in denen zwei oder mehr DSLs integriert sind. VMSDK wurde speziell dafür entwickelt, die Integration Ihrer Erweiterungen in den Code zu vereinfachen, der aus der DSL-Definition generiert wird. Weitere Informationen finden Sie unter Writing Code to Customise a Domain-Specific Language.

Ändern der DSL-Definition

Wenn Sie ein Element in einer DSL-Definition erstellen, werden viele Standardwerte automatisch festgelegt. Diese Werte können Sie anschließend ändern. Dies vereinfacht die Entwicklung einer DSL und ermöglicht gleichzeitig wirkungsvolle Anpassungen.

Wenn Sie beispielsweise eine Form einem Element zuordnen, wird der Pfad des übergeordneten Elements der Zuordnung automatisch entsprechend der einbettenden Beziehung der Domänenklasse festgelegt. Wenn Sie die einbettende Beziehung später ändern, wird der Pfad des übergeordneten Elements nicht automatisch geändert.

Daher sollten Sie damit rechnen, dass nach einer Änderung von Beziehungen in der DSL-Definition häufig Fehler gemeldet werden, wenn Sie die Definition speichern oder "Alle Vorlagen transformieren" verwenden. Die meisten dieser Fehler sind leicht zu beheben. Doppelklicken Sie auf den Fehlerbericht, um den Ort des Fehlers zu ermitteln.

Siehe auch How to: Change the Namespace of a Domain-Specific Language.

Problembehandlung

In der folgenden Tabelle sind einige der häufigsten Probleme, die beim Entwurf einer DSL auftreten, zusammen mit ihrer Lösung aufgeführt. Weitere Ratschläge finden Sie im Forum zur Erweiterbarkeit von Visualisierungstools.

Problem

Vorschlag

Die Änderungen, die ich an der DSL-Definition vorgenommen habe, wirken sich nicht aus.

Klicken Sie in der Symbolleiste des Projektmappen-Explorers auf Alle Vorlagen transformieren, und erstellen Sie dann die Projektmappe neu.

Formen zeigen statt des Eigenschaftenwerts den Namen eines Decorator-Elements an.

Richten Sie die Decorator-Zuordnung ein. Klicken Sie im DSL-Definitionsdiagramm auf die Diagrammelementzuordnung (die graue Linie zwischen der Domänenklasse und der Formklasse).

Öffnen Sie das Fenster DSL-Details. Wenn Sie es nicht sehen, zeigen Sie im Menü "Ansicht" auf Weitere Fenster, und klicken Sie dann auf DSL-Details.

Klicken Sie auf die Registerkarte Decorator-Zuordnungen. Wählen Sie den Namen des Decorator-Elements aus. Vergewissern Sie sich, dass das Kontrollkästchen daneben aktiviert ist. Wählen Sie unter Anzeigeeigenschaft den Namen einer Domäneneigenschaft aus.

Weitere Informationen finden Sie im Abschnitt Formen im Diagramm.

Ich kann in DSL-Explorer keine Auflistung hinzufügen. Zum Beispiel gibt es beim Rechtsklick auf "Werkzeuge" keinen "Tool hinzufügen"-Befehl im Menü.

Ich kann im Explorer für meine DSL kein Element zu einer Liste hinzufügen.

Klicken Sie mit der rechten Maustaste auf das Element über dem Knoten, den Sie testen. Wenn Sie etwas zu einer Liste hinzufügen möchten, befindet sich der Befehl zum Hinzufügen nicht im Listenknoten, sondern in seinem Besitzer.

Ich habe eine Domänenklasse erstellt, aber ich kann im Explorer der Sprache keine Instanzen erstellen.

Jede Domänenklasse mit Ausnahme des Stamms muss Ziel einer einbettenden Beziehung sein.

Im Explorer für meine DSL werden die Elemente nur mit ihren Typennamen angezeigt.

Wählen Sie in der DSL-Definition eine Domäneneigenschaft der Klasse aus, und setzen Sie im Eigenschaftenfenster Ist Elementname auf True.

Meine DSL wird immer im XML-Editor geöffnet.

Das kann an einem Fehler beim Lesen der Datei liegen. Nachdem Sie den Fehler behoben haben, müssen Sie den Editor explizit als Ihren DSL-Designer zurücksetzen.

Klicken Sie mit der rechten Maustaste auf das Projektelement, klicken Sie auf Öffnen mit, und wählen Sie IhreSprache Designer (Standard) aus.

Der Werkzeugkasten meiner DSL wird nicht angezeigt, nachdem ich die Assemblynamen geändert habe.

Untersuchen und aktualisieren Sie DslPackage\GeneratedCode\Package.tt Weitere Informationen finden Sie unter How to: Change the Namespace of a Domain-Specific Language.

Der Werkzeugkasten meiner DSL wird nicht angezeigt, obwohl ich die Assemblynamen nicht geändert habe.

Oder es wird in einem Meldungsfeld gemeldet, dass eine Erweiterung nicht geladen werden konnte.

Setzen Sie die experimentelle Instanz zurück, und erstellen Sie die Projektmappe neu.

  1. Erweitern Sie im Windows-Startmenü unter Alle Programme zuerst Visual Studio SDK, dann Tools, und klicken Sie anschließend auf Experimentelle Instanz von Microsoft Visual Studio zurücksetzen.

  2. Klicken Sie im Menü Build von Visual Studio auf Projektmappe neu erstellen.

Siehe auch

Aufgaben

Creating a Windows Forms-Based Domain-Specific Language

Konzepte

Getting Started with Domain-Specific Languages

Creating a WPF-Based Domain-Specific Language