So definieren Sie eine domänenspezifische Sprache

Um eine domänenspezifische Sprache (DSL) zu definieren, erstellen Sie eine Visual Studio Lösung aus 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 noch nicht mit DSLs gearbeitet haben, empfiehlt es sich, das DSL-Tools-Lab zu durcharbeiten, das Sie auf dieser Website finden: Visualisierungs- und Modellierungs-SDK.

Auswählen einer Vorlagenlösung

Zur Definition einer DSL müssen folgende Komponenten installiert sein:

  • Visual Studio
  • Visual Studio Workload für die Erweiterungsentwicklung (einschließlich des Visual Studio SDK)
  • Modellierungs-SDK (installieren Sie es als einzelne Komponente in Visual Studio)

Hinweis

Die Komponente Textvorlagentransformation wird automatisch als Teil der Workload Visual Studio-Erweiterungsentwicklung installiert. Sie können die Installation auch über die Registerkarte Einzelne Komponenten des Visual Studio-Installers unter der Kategorie SDKs, Bibliotheken und Frameworks durchführen. Installieren Sie die Komponente Modellierungs-SDK auf der Registerkarte Einzelne Komponenten.

Um eine neue domänenspezifische Sprache zu erstellen, erstellen Sie mithilfe der Projektvorlage Domain-Specific Language eine neue Visual Studio Projektmappe.

So erstellen Sie eine DSL-Projektmappe

  1. Erstellen Sie ein neues Projekt für eine domänenspezifische Sprache.

    Dialogfeld "DSL erstellen"

    Der Domänenspezifische Sprach-Assistent wird geöffnet und zeigt eine Liste der DSL-Vorlagenlösungen an.

  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 Task Flow aus, um eine DSL mit Verantwortlichkeitsleisten zu erstellen. Verantwortlichkeitsbereiche sind vertikale oder horizontale Bereiche des Diagramms.

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

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

    • Wählen Sie in anderen Fällen Minimalsprache aus, oder wenn Sie unsicher sind.

    • Wählen Sie Minimal WinForm Designer oder Minimal 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 in den folgenden Themen:

      Erstellen einer Windows Forms-basierten domänenspezifischen Sprache

      Erstellen einer WPF-basierten domänenspezifischen Sprache

  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. Beispielsweise wären docx und htm unzulässige 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, klicken Sie auf Alle Programme, Microsoft Visual Studio 2010 SDK, Tools, und setzen Sie dann die Microsoft Visual Studio 2010 Experimentelle Instanz zurück.

  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 Übersicht über die Domain-Specific Language Tools Benutzeroberfläche.

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 experimentellen Modus geöffnet.

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

Wenn Sie eine Projektmappe ausführen, die Sie aus der Vorlage "Minimale Sprache" erstellt haben, ähnelt Ihr experimenteller Visual Studio dem folgenden Beispiel:

Beispielstruktur für domänenspezifische Sprache in Visual Studio

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 wird oben links im DSL-Definitionsdiagramm unter Klassen und Beziehungen angezeigt. Benennen Sie sie in einen von der DSL verschiedenen Namen um. Beispielsweise kann eine DSL mit dem Namen MusicLibrary über eine Stammklasse namens Musik verfügen.

  • Die Diagrammklasse wird unten rechts im DSL-Definitionsdiagramm in der Spalte Diagrammelemente angezeigt. Möglicherweise müssen Sie einen Bildlauf nach rechts durchführen, um sie zu sehen. Der Name lautet in der Regel YourDsl-Diagramm.

  • Wenn Sie die Vorlage Task Flow verwendet haben und Diagramme mit Verantwortlichkeitsleisten erstellen möchten, behalten Sie die Actor-Domänenklasse und die ActorSwimlane-Form bei, und benennen Sie sie um.

    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

Nachdem Sie ein Feature hinzugefügt haben, vergessen Sie nicht, auf der Symbolleiste von Projektmappen-Explorer auf Alle Vorlagen transformieren zu klicken, bevor Sie Ihre 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 MusicLibrary-DSL verfügen Sie beispielsweise möglicherweise über Domänenklassen mit den Namen Album und Song.

Um eine Domänenklasse zu erstellen, können Sie aus dem Tool Benannte Domänenklasse in das Diagramm ziehen und dann die Klasse umbenennen.

Weitere Informationen finden Sie unter Eigenschaften von Domänenklassen.

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 gleichzeitig eine Domänenklasse und deren Einbettung zu erstellen, klicken Sie auf das Tool Embedding Relationship (Beziehung einbetten), dann auf die übergeordnete Klasse und dann auf einen leeren Teil 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 Eigenschaften von Domänenbeziehungen und Eigenschaften von Domänenrollen.

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 im Fenster Eigenschaften den Typ fest. Wenn der typ, den Sie wünschen, nicht in der Dropdownliste enthalten ist, finden Sie weitere Informationen unter Hinzufügen von Eigenschaftentypen.

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 den Is-Elementnamen 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 mithilfe des Domänenklassentools.

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

Erwägen Sie, den Vererbungsmodifizierer der Basisklasse so zu setzen, dass er abstrahiert. 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 reduzieren und das Diagramm zu verkleinern, klicken Sie mit der rechten Maustaste auf die Zielklasse einer Beziehung, und klicken Sie dann auf Bring Tree Here. Klicken Sie für den umgekehrten Effekt mit der rechten Maustaste auf die Zielklasse einer Beziehung, und klicken Sie auf Struktur teilen. 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 der Symbolleiste des -Projektmappen-Explorer auf Alle Vorlagen transformieren, um den DSL-Designercode zu generieren. Dieser Schritt kann automatisiert werden. Weitere Informationen finden Sie unter Automatisieren der 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 ausführen. Öffnen oder erstellen Sie in Visual Studio Instanz von eine Datei mit der Dateinamenerweiterung Ihrer DSL.

  3. Öffnen Sie den Explorer. Auf der Seite des Diagramms befindet sich das Fenster des Sprach-Explorers, das in der Regel DenLanguage-Explorer heißt. Sollten Sie das Fenster nicht sehen, befindet es sich möglicherweise auf einer Registerkarte unter dem Projektmappen-Explorer. Wenn Sie sie nicht finden, zeigen Sie im Menü Ansicht auf Andere Windows , und klicken Sie dann auf IhrLanguage-Explorer .

    Im Explorer wird eine Strukturansicht des Modells dargestellt.

  4. Erstellen Sie neue Elemente. Klicken Sie oben mit der rechten Maustaste auf den Stammknoten, und klicken Sie dann auf Neue Klassehinzufügen.

    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 tritt nur auf, wenn Sie das Flag Is Element Name für eine Domäneneigenschaft festgelegt haben.

  6. Überprüfen Sie die Domäneneigenschaften. Wenn Sie eine Instanz Ihrer -Klasse ausgewählt haben, überprüfen Sie die 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 unterDefinieren 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. Bevor Sie mit diesem Verfahren fortfahren, finden Sie weitere Informationen unter Definieren einer DSL, die über Eine -Dsl verfügt.

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

    • Geometry Shape stellt ein Rechteck oder eine Ellipse zur Auswahl.

    • Bildform zeigt ein von Ihnen angezeigtes Bild an.

    • "Compartment Shape" ist ein Rechteck, das eine oder mehrere Listen 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, wenn Sie eine Bildform 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 Image.

    5. Klicken Sie im Dialogfeld Bild auswählen unter Dateiname auf das Dropdownmenü, 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 Shape-Klasse, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Text decorator. Legen Sie den Namen des Decorators fest, und legen Sie in der Eigenschaftenfenster position fest.

  5. Verbinden jede Form mit einer Diagrammelementzuordnung zur Domänenklasse, die angezeigt werden soll.

    Klicken Sie auf das Tool Diagrammelementzuordnung, dann auf die Domänenklasse und dann auf die Shape-Klasse.

  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 Karten . Wenn das Fenster DSL-Details nicht angezeigt wird, zeigen Sie im Menü Ansicht auf Andere Windows, 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 verknüpften Elements anzeigen möchten, klicken Sie auf den Dropdownstrukturnavigator unter Pfad, um die Eigenschaft anzuzeigen.

    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 im DSL-Explorer den Knoten Editor und alle zugehörigen Unterknoten.

    2. Klicken Sie mit der rechten Maustaste auf den Knoten unter Toolboxregisterkarten, der den gleichen Namen wie Ihre DSL hat, z. B. MusicLibrary. Klicken Sie auf Elementtool hinzufügen.

      Hinweis

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

    3. Legen Sie im Eigenschaftenfenster, in dem das neue Elementtool ausgewählt ist, Klasse auf die Domänenklasse fest, die Sie vor Kurzem hinzugefügt haben.

    4. Legen Sie Beschriftung und QuickInfo fest.

    5. Legen Sie Toolboxsymbol auf ein Symbol fest, das in der Toolbox 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\Resources in 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 Tool aus, und klicken Sie im Eigenschaftenfenster unter Toolboxsymbol auf [...] . Wählen Sie im Dialogfeld Bitmap auswählen im Dropdownmenü Ihre .BMP-Datei aus.

    Weitere Informationen finden Sie unter Eigenschaften von Geometrieformen und Eigenschaften von Bildformen.

So testen Sie Formen

  1. Klicken Sie auf der Symbolleiste von Projektmappen-Explorer auf Alle Vorlagen transformieren, 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 Dateierweiterung Ihrer DSL.

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

  4. Erstellen Sie Formen, indem Sie von einem Tool auf das Modelldiagramm ziehen.

  5. Vergewissern Sie sich, dass jeder Textdekorator angezeigt wird und dass Folgendes zu überprüfen ist:

    1. Sie können ihn bearbeiten, es sei denn, Sie haben das Flag Is UI Read Only (Schreibgeschützt für die Benutzeroberfläche) für die Domäneneigenschaft festgelegt.

    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 Anpassen und Erweitern einer Domain-Specific Sprache.

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.

<a name="define-a-reference-relationship">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 die Multiplikizitäten jeder Rolle an, falls erforderlich. 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 Eigenschaft Duplikate zulässig der Beziehung fest, wenn zwischen demselben Modellelementpaar mehrere Verknüpfungen 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 Eigenschaften von Domänenbeziehungen und Eigenschaften von Domänenrollen.

Definieren eines Konnektors zur Darstellung der Beziehung

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

Ziehen Sie das Connector-Tool in das DSL-Definitionsdiagramm.

Fügen Sie Text-Decorator-Elemente hinzu, falls Beschriftungen auf dem Konnektor angezeigt werden sollen. Legen Sie deren Positionen fest. Um dem Benutzer das Verschieben eines Textdekorators zu erlauben, legen Sie seine Is Moveable-Eigenschaft fest.

Verwenden Sie das Diagrammelementzuordnungstool, um den Connector mit der Verweisbeziehung zu verknüpfen.

Öffnen Sie bei ausgewählter Diagrammelementzuordnung das Fenster DSL-Details, und öffnen Sie die Registerkarte Decorator Karten .

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

Stellen Sie sicher, dass neben jedem Element in der Liste Decorators 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, der den gleichen Namen wie Ihre DSL hat, und klicken Sie dann auf Neues Verbindungstool hinzufügen.

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

  • Legen Sie die Beschriftung und die QuickInfo fest.

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

  • Legen Sie Toolboxsymbol auf das Symbol fest, das in der Toolbox 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\Resources in 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 Tool aus, und klicken Sie im Eigenschaftenfenster unter Toolboxsymbol auf [...] . Wählen Sie im Dialogfeld Bitmap auswählen im Dropdownmenü Ihre .BMP-Datei aus.

So testen Sie eine Verweisbeziehung und einen Konnektor
  1. Klicken Sie auf der Symbolleiste von Projektmappen-Explorer auf Alle Vorlagen transformieren, 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 ausführen. Öffnen oder erstellen Sie in Visual Studio Instanz von eine Datei mit der Dateinamenerweiterung Ihrer DSL.

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

  4. Erstellen Sie Formen, indem Sie von einem Tool 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 Multiplikitäten richtig sind. Stellen Sie beispielsweise sicher, dass Sie eine Person nicht mit mehr als einem Vorgesetzten verbinden können.

  8. Vergewissern Sie sich, dass jedes Textdekorator angezeigt wird und dass:

    1. Sie können sie bearbeiten, es sei denn, Sie haben das Flag Is UI Read Only für die Domäneneigenschaft festgelegt.

    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 Anpassen und Erweitern einer Domain-Specific Sprache.

Definieren von Formen, die Listen enthalten: Abteilformen

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 Eigenschaften von Abteilformen.

So definieren Sie eine Depot-Form

  1. Erstellen Sie die Containerdomänenklasse. Klicken Sie auf das Tool Embedding Relationship (Beziehung einbetten), klicken Sie auf die Stammklasse des Modells, und klicken Sie dann auf einen leeren Teil 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 legen Sie das Flag Is-Elementname im Eigenschaftenfenster.

  2. Erstellen Sie die Listenelementdomänenklasse. Klicken Sie auf das Tool Embedding Relationship (Beziehung einbetten), klicken Sie auf die Containerklasse (Album), und klicken Sie dann auf einen leeren Teil des Diagramms. Dadurch wird in der Beispielabbildung die Domänenklasse namens "Song" erstellt.

    Fügen Sie der Klasse eine Domäneneigenschaft wie Title hinzu, und legen Sie das Flag Is Element Name fest.

    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 deren 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 Verteilform. Ziehen Sie vom Tool "Compartment Shape" 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. Damit der Benutzer die Listendeparttimes ausblenden kann, klicken Sie mit der rechten Maustaste auf die Klasse für die Verteilformung, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Decorator erweitern/reduzieren. Legen Sie im Eigenschaftenfenster die Position des Decorator-Elements fest.

  6. Klicken Sie auf das Diagrammelementzuordnungstool, klicken Sie auf die Containerdomänenklasse, und klicken Sie dann auf die Form des Bereichs.

  7. Wählen Sie den Diagrammelementzuordnungs-Link zwischen der Domänenklasse und der Form aus. Im Fenster DSL-Details:

    1. Klicken Sie auf die Registerkarte Decorators (Decorators). Klicken Sie auf den Namen des Decorators, und wählen Sie dann unter Display Property (Eigenschaft anzeigen) das entsprechende Element aus. Stellen Sie sicher, dass neben dem Namen des Decorator-Elements ein Häkchen angezeigt wird.

    2. Klicken Sie auf Karten Aufschluss.

      Klicken Sie auf den Namen des Depots.

      Navigieren Sie unter Anzeigeelement-Auflistungspfad 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 im DSL-Explorer den Knoten Editor und alle untergeordneten Knoten.

  3. Klicken Sie mit der rechten Maustaste auf den Knoten unter Toolboxregisterkarte, der den gleichen Namen wie Ihre DSL hat, z. B. MusicLibrary. Klicken Sie auf Elementtool hinzufügen.

    Hinweis

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

  4. Legen Sie Eigenschaftenfenster das neue Elementtool ausgewählt haben, Class auf die Domänenklasse fest, die Sie vor Kurzem hinzugefügt haben.

  5. Legen Sie Beschriftung und QuickInfo fest.

  6. Legen Sie Toolboxsymbol auf ein Symbol fest, das in der Toolbox 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\Resources in 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 Tool aus, und klicken Sie Eigenschaftenfenster symbol toolbox auf [...] . Wählen Sie im Dialogfeld Bitmap auswählen im Dropdownmenü Ihre BMP-Datei aus.

So testen Sie eine Depot-Form

  1. Klicken Sie auf der Symbolleiste des -Projektmappen-Explorer auf Alle Vorlagen transformieren, 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 ausführen. Öffnen oder erstellen Sie in Visual Studio Instanz von 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 die Kopfzeile der neuen Form, und klicken Sie dann auf Ihr Listenelement 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 Anpassen und Erweitern einer Domain-Specific Sprache.

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 Form des Abteiles ein Abteil hinzu. Klicken Sie im DSL-Definitionsdiagramm mit der rechten Maustaste auf die Shape-Klasse für das Abteil, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Compartment.

  2. Legen Sie Displayed elements collection path (Sammlungspfad für angezeigte Elemente) fest, um anstelle des Zielelements zum Link zu navigieren. Klicken Sie auf das Dropdownmenü, und verwenden Sie die Strukturansicht, um die Verweisbeziehung statt ihres Ziels auszuwählen. Im Beispiel ist die Beziehung "InterpretAppearedOn Wies".

  3. Legen Sie Pfad auf Display Property (Eigenschaft anzeigen) fest, um vom Link zum Zielelement zu navigieren. Im Beispiel ist dies Interpret.

  4. Legen Sie Display Property auf die entsprechende Eigenschaft des Zielelements fest, z. B. Name.

  5. Transformieren Sie Alle Vorlagen, erstellen Sie die DSL, führen Sie sie aus, und öffnen Sie 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 Ports an der Grenze 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.

Um ein Beispiel mit Ports zu sehen, wählen Sie die Vorlage Komponentendiagramm aus, wenn Sie eine neue DSL-Projektmappe erstellen. 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. In diesem Beispiel 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.

    In anderer Hinsicht verhalten sich Portformen wie unter Definieren von Formen beschrieben.

    Weitere Informationen finden Sie unter Eigenschaften von Portformen.

Definieren einer DSL mit "Swimlanes"

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 Eigenschaften von Swimlanes.

Hinzufügen von Eigenschaftstypen

Domänenenumerationen und Literale

Eine Domänenenumeration ist ein Typ mit mehreren Literalwerten.

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

Um der Domänenenumeration Enumerationsliterale hinzuzufügen, klicken Sie im 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. Wenn Sie möchten, dass Benutzer und Programmierer eine beliebige Kombination von Werten ( ein "Bitfeld" ) festlegen können, legen Sie die IsFlags-Eigenschaft der Enumeration fest.

Externe Typen

Wenn Sie den Typ einer Domäneneigenschaft festlegen und den typ nicht in der Dropdownliste Typ finden, können Sie einen externen Typ hinzufügen. Beispielsweise können Sie der Liste den System.Drawing.Color-Typ hinzufügen.

Um einen Typ hinzuzufügen, klicken Sie im DSL-Explorer mit der rechten Maustaste auf den Stamm des Modells, und klicken Sie dann auf Neuen externen Typ hinzufügen. Legen Sie Eigenschaftenfenster namen auf Color und den Namespace auf System.Drawing fest. Dieser Typ wird jetzt im DSL-Explorer unter Domänentypen angezeigt. 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 Anpassen und Erweitern einer Domain-Specific Sprache.

  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 Customize 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 oben in der Symbolleiste auf Alle Vorlagen transformieren Projektmappen-Explorer, 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 nicht angezeigt wird, zeigen Sie im Menü Ansicht auf Andere Windows , und klicken Sie dann auf DSL-Details.

Klicken Sie auf die Registerkarte Karten Decorator. Wählen Sie den Namen des Decorator 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 unter 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 legen Sie im Eigenschaftenfenster Is Element Name auf true fest.
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 YourLanguageDesigner (Standard) aus.
Der Werkzeugkasten meiner DSL wird nicht angezeigt, nachdem ich die Assemblynamen geändert habe. Überprüfen und Aktualisieren von 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 die Option , und klicken Sie dann auf Visual Studio SDK Microsoft Visual Studio Experimentelle Instanz zurücksetzen.
2. Klicken Sie im Menü Erstellen auf Projektmappe neu erstellen.

Siehe auch