Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema werden die grundlegenden Konzepte zum Definieren und Verwenden einer domänenspezifischen Sprache (DSL) erläutert, die mit dem Modeling SDK für Visual Studio erstellt wurde.
Hinweis
Das Textvorlagentransformations-SDK und das Visual Studio Modeling SDK werden automatisch installiert, wenn Sie bestimmte Features von Visual Studio installieren. Weitere Informationen finden Sie in diesem Blogbeitrag.
Wenn Sie noch nicht mit DSLs arbeiten, empfehlen wir, dass Sie das VMSDK Lab durcharbeiten, das Sie in diesem Repository finden können.
Was können Sie mit einer Domain-Specific Sprache tun?
Eine domänenspezifische Sprache ist eine Notation, in der Regel grafisch, die für einen bestimmten Zweck verwendet werden soll. Im Gegensatz dazu sind Sprachen wie UML universell einsetzbar. In einem DSL können Sie die Typen des Modellelements und deren Beziehungen definieren und wie sie auf dem Bildschirm dargestellt werden.
Wenn Sie ein DSL entworfen haben, können Sie es als Teil eines Visual Studio Integration Extension (VSIX)-Pakets verteilen. Benutzer arbeiten mit dem DSL in Visual Studio:
Die Notation ist nur Teil eines DSL. Zusammen mit der Notation enthält Ihr VSIX-Paket Tools, die Benutzer anwenden können, um sie beim Bearbeiten und Generieren von Material aus ihren Modellen zu unterstützen.
Eine der wichtigsten Anwendungen von DSLs besteht darin, Programmcode, Konfigurationsdateien und andere Artefakte zu generieren. Insbesondere in großen Projekten und Produktlinien, bei denen mehrere Varianten eines Produkts erstellt werden, kann die Generierung vieler variabler Aspekte aus DSLs eine große Erhöhung der Zuverlässigkeit und eine sehr schnelle Reaktion auf Anforderungenänderungen bieten.
Der Rest dieser Übersicht ist eine exemplarische Vorgehensweise, in der die grundlegenden Vorgänge zum Erstellen und Verwenden einer domänenspezifischen Sprache in Visual Studio vorgestellt werden.
Voraussetzungen
Um ein DSL zu definieren, müssen Sie die folgenden Komponenten installiert haben:
| Komponente | Link |
|---|---|
| Visual Studio (beliebige Edition) | http://go.microsoft.com/fwlink/?LinkId=185579 |
| Wählen Sie die Workload für die Entwicklung von Visual Studio-Erweiterungen aus (einschließlich Visual Studio SDK) | https://go.microsoft.com/fwlink/?linkid=2166172 |
| Modellierungs-SDK (nicht standardmäßig installiert) | |
| Klassen-Designer (nicht standardmäßig installiert) | Abschnitt "Codetools" auf der Registerkarte "Einzelkomponenten" des Installers |
Hinweis
Die Textvorlagentransformationskomponente wird automatisch als Teil der Visual Studio-Erweiterungsentwicklungsworkloads installiert. Sie können es auch auf der Registerkarte "Einzelne Komponenten " von Visual Studio Installer unter der Kategorie SDKs, Bibliotheken und Frameworks installieren. Installieren Sie die Modellierungs-SDK-Komponente auf der Registerkarte "Einzelne Komponenten ".
Erstellen einer DSL-Lösung
Zum Erstellen einer neuen domänenspezifischen Sprache erstellen Sie eine neue Visual Studio-Projektmappe mithilfe der Projektvorlage für domänenspezifische Sprachen.
Zeigen Sie im Menü "Datei" auf "Neu", und klicken Sie dann auf "Projekt".
Erstellen Sie ein neues Projekt.
Im Suchfeld geben Sie domain ein
Klicken Sie auf Domänenspezifischer Sprach-Designer, und klicken Sie dann auf Weiter.
Konfigurieren Sie Ihr neues Projekt.
- Geben Sie im Feld "Projektname " "FamilyTree" ein. Klicken Sie auf "Erstellen".
Der Domain-Specific Language Designer Wizard wird geöffnet und zeigt eine Liste von DSL-Vorlagenlösungen an.
- Klicken Sie auf jede Vorlage, um eine Beschreibung anzuzeigen,
Die Vorlagen sind hilfreiche Ausgangspunkte. Jeder von ihnen bietet ein komplettes funktionierendes DSL, das Sie entsprechend Ihren Anforderungen bearbeiten können. Normalerweise würden Sie die Vorlage auswählen, die dem am nächsten kommt, was Sie erstellen möchten.
- Wählen Sie für diese exemplarische Vorgehensweise die Vorlage " Minimale Sprache " aus. Klicke auf Weiter.
Neuen Modelldateityp definieren
- Geben Sie im Feld Welche Erweiterung sollten Modelldateien verwenden? eine Dateierweiterung ftree für Ihr DSL an. Dies ist die Erweiterung, die Dateien mit Instanzen Ihres DSL verwenden werden.
Von Bedeutung
Sie müssen eine Erweiterung auswählen, die keiner Anwendung auf Ihrem Computer oder auf einem Computer zugeordnet ist, auf dem Sie das DSL installieren möchten. Docx und htm wären beispielsweise inakzeptable Dateinamenerweiterungen. Der Assistent warnt Sie, wenn die eingegebene Erweiterung als DSL verwendet wird. In diesem Fall sollten Sie eine andere Dateinamenerweiterung verwenden. Sie können auch die Visual Studio SDK Experimental-Instanz zurücksetzen, um alte experimentelle Designer zu löschen. Geben Sie im Windows-Startmenü"Visual Studio zurücksetzen" ein, und führen Sie dann den Befehl "Microsoft Visual Studio Experimental Instance zurücksetzen " aus, der Ihrer Version von Visual Studio entspricht.
Überprüfen Sie die anderen Seiten (klicken Sie auf 'Weiter'), und klicken Sie dann auf 'Fertig stellen'.
Eine Lösung wird generiert, die zwei Projekte enthält. Sie heißen Dsl und DslPackage. Eine Diagrammdatei wird geöffnet, die den Namen DslDefinition.dsl hat.
Hinweis
Der großteil des Codes, den Sie in den Ordnern in den beiden Projekten sehen können, wird aus DslDefinition.dsl generiert. Aus diesem Grund werden die meisten Änderungen an Ihrem DSL in dieser Datei vorgenommen.
Die Benutzeroberfläche ähnelt nun der folgenden Abbildung.
Diese Lösung definiert eine domänenspezifische Sprache. Weitere Informationen finden Sie unter Übersicht über die Benutzeroberfläche der domänenspezifischen Sprachwerkzeuge.
Die wichtigen Teile der DSL-Lösung
Beachten Sie die folgenden Aspekte der neuen Lösung:
Dsl\DslDefinition.dsl Dies ist die Datei, die beim Erstellen einer DSL-Lösung angezeigt wird. Fast der gesamte Code in der Lösung wird aus dieser Datei generiert, und die meisten Änderungen, die Sie an einer DSL-Definition vornehmen, werden hier vorgenommen. Weitere Informationen finden Sie unter Arbeiten mit dem DSL-Definitionsdiagramm.
Dsl-Projekt Dieses Projekt enthält Code, der die domänenspezifische Sprache definiert.
DslPackage-Projekt Dieses Projekt enthält Code, mit dem Instanzen des DSL in Visual Studio geöffnet und bearbeitet werden können.
Ausführen des DSL
Sie können die DSL-Lösung ausführen, sobald Sie sie erstellt haben. Später können Sie die DSL-Definition schrittweise ändern und die Lösung nach jeder Änderung erneut ausführen.
So experimentieren Sie mit dem DSL
Klicken Sie im Menü "Erstellen" auf "Alle T4-Vorlagen transformieren". Dadurch wird der Großteil des Quellcodes von DslDefinition.dsl neu generiert.
Hinweis
Immer wenn Sie DslDefinition.dsl ändern, müssen Sie auf "Alle T4-Vorlagen transformieren " klicken, bevor Sie die Lösung neu erstellen. Dieser Schritt kann automatisiert werden. Weitere Informationen finden Sie unter How to Automate Transform All Templates.
Drücken Sie F5, oder klicken Sie im Menü " Debuggen " auf "Debuggen starten".
Die DSL wird erstellt und in der experimentellen Instanz von Visual Studio installiert.
Eine experimentelle Instanz von Visual Studio wird gestartet. Die experimentelle Instanz verwendet ihre Einstellungen aus einer separaten Unterstruktur der Registrierung, in der Visual Studio-Erweiterungen für Debuggingzwecke registriert sind. Normale Instanzen von Visual Studio haben keinen Zugriff auf dort registrierte Erweiterungen.
Öffnen Sie in der experimentellen Instanz von Visual Studio die Modelldatei mit dem Namen "Sample.ftree " im Projektmappen-Explorer.
– oder –
Klicken Sie mit der rechten Maustaste auf das Debugprojekt, zeigen Sie auf "Hinzufügen", und klicken Sie dann auf "Neues Element". Wählen Sie im Dialogfeld "Neues Element hinzufügen " den Dateityp Ihres DSL (FamilyTree in unserem Beispiel) aus.
Die Modelldatei wird als leeres Diagramm geöffnet.
Die Toolbox wird geöffnet und zeigt Tools an, die für den Diagrammtyp geeignet sind. Sie können die Toolbox auch anzeigen, indem Sie auf das Menü "Ansicht/Toolbox" klicken.
Verwenden Sie die Tools zum Erstellen von Shapes und Verbindern im Diagramm.
Um Shapes zu erstellen, ziehen Sie aus dem Beispiel-Shape-Tool auf das Diagramm.
Wenn Sie zwei Formen verbinden möchten, klicken Sie auf das Tool "Beispielverbinder", klicken Sie auf die erste Form und dann auf das zweite Shape.
Klicken Sie auf die Beschriftungen der Shapes, um sie zu ändern.
Ihr experimentelles Visual Studio ähnelt dem folgenden Beispiel:
Der Inhalt eines Modells
Der Inhalt einer Datei, die eine Instanz eines DSL ist, wird als Modell bezeichnet. Das Modell enthält Modellelemente und Verknüpfungen zwischen den Elementen. Die DSL-Definition gibt an, welche Typen von Modellelementen und Verknüpfungen im Modell vorhanden sein können. Beispielsweise gibt es in einem DSL, das aus der Vorlage "Minimale Sprache" erstellt wurde, einen Typ von Modellelement und einen Linktyp.
Die DSL-Definition kann angeben, wie das Modell in einem Diagramm angezeigt wird. Sie können aus einer Vielzahl von Formen und Verbindern auswählen. Sie können angeben, dass einige Formen in anderen Formen angezeigt werden.
Sie können ein Modell als Struktur in der Explorer-Ansicht anzeigen, während Sie ein Modell bearbeiten. Wenn Sie dem Diagramm Shapes hinzufügen, werden die Modellelemente auch im Explorer angezeigt. Der Explorer kann auch dann verwendet werden, wenn kein Diagramm vorhanden ist.
Wenn der Explorer in der Debuginstanz von Visual Studio nicht angezeigt wird, wählen Sie im Menü Ansicht den Eintrag Andere Fenster aus, und klicken Sie dann auf <Sprach>Explorer.
Die API Ihres DSL
Ihr DSL generiert eine API, mit der Sie Modelle lesen und aktualisieren können, die Instanzen des DSL sind. Eine Anwendung der API besteht darin, Textdateien aus einem Modell zu generieren. Weitere Informationen finden Sie unter Design-Time Codegenerierung mithilfe von T4-Textvorlagen.
Öffnen Sie in der Debuglösung die Vorlagendateien mit der Erweiterung ".tt". In diesen Beispielen wird veranschaulicht, wie Sie Text aus Modellen generieren können, und sie ermöglichen es Ihnen, die API Ihres DSL zu testen. Eines der Beispiele wird in Visual Basic geschrieben, der andere in Visual C#.
Unter jeder Vorlagendatei befindet sich die Datei, die generiert wird. Erweitern Sie die Vorlagendatei im Projektmappen-Explorer, und öffnen Sie die generierte Datei.
Die Vorlagendatei enthält ein kurzes Codesegment, das alle Elemente im Modell auflistet.
Die generierte Datei enthält das Ergebnis.
Wenn Sie eine Modelldatei ändern, werden die entsprechenden Änderungen in generierten Dateien angezeigt, nachdem Sie die Dateien neu erstellt haben.
So generieren Sie Textdateien nach dem Ändern der Modelldatei neu
Speichern Sie die Modelldatei in der experimentellen Instanz von Visual Studio.
Stellen Sie sicher, dass der Dateinameparameter in jeder TT-Datei auf die Modelldatei verweist, die Sie für Experimente verwenden. Speichern Sie die TT-Datei.
Klicken Sie im Menü "Erstellen" auf "Alle T4-Vorlagen transformieren".
– oder –
Klicken Sie mit der rechten Maustaste auf die Vorlagen, die Sie neu generieren möchten, und klicken Sie dann auf "Benutzerdefiniertes Tool ausführen".
Sie können einem Projekt eine beliebige Anzahl von Textvorlagendateien hinzufügen. Jede Vorlage generiert eine Ergebnisdatei.
Hinweis
Wenn Sie die DSL-Definition ändern, funktioniert der Beispieltextvorlagencode nicht, es sei denn, Sie aktualisieren sie.
Weitere Informationen finden Sie unter Generieren von Code aus einer Domain-Specific Sprache und Schreiben von Code zum Anpassen einer Domain-Specific Sprache.
Anpassen des DSL
Wenn Sie die DSL-Definition ändern möchten, schließen Sie die experimentelle Instanz, und aktualisieren Sie die Definition in der Visual Studio-Hauptinstanz.
Hinweis
Nachdem Sie die DSL-Definition geändert haben, verlieren Sie möglicherweise Informationen in den Testmodellen, die Sie mit früheren Versionen erstellt haben. Die Debuglösung enthält z. B. eine Datei mit dem Namen "Sample", die einige Shapes und Connectors enthält. Nachdem Sie mit der Entwicklung Ihrer DSL-Definition begonnen haben, sind sie nicht sichtbar, und sie gehen verloren, wenn Sie die Datei speichern.
Sie können eine Vielzahl von Erweiterungen für Ihr DSL herstellen. Die folgenden Beispiele geben Ihnen einen Eindruck von den Möglichkeiten.
Speichern Sie nach jeder Änderung die DSL-Definition, klicken Sie im Menü "Build" auf "Alle T4-Vorlagen transformieren", und drücken Sie dann F5, um mit dem geänderten DSL zu experimentieren.
Umbenennen der Typen und Tools
Benennen Sie die vorhandenen Domänenklassen und -beziehungen um. Beispielsweise können Sie ab einer DSL-Definition, die aus der Vorlage "Minimal Language template" erstellt wurde, die folgenden Umbenennungsvorgänge ausführen, um die DSL-Familienstammbäume darzustellen.
So benennen Sie Domänenklassen, Beziehungen und Tools um
Benennen Sie im DslDefinition-Diagramm ExampleModel in FamilyTreeModel, ExampleElement in Person, Targets in Children (und Name in Parent) , Sources in Parents (und Name in Child), Elements in People, und die DomainRelationship PersonReferencesChildren in ParentsHaveChildren um. Benennen Sie auch das Diagrammelement ExampleConnector in ChildConnector um. Sie können auf jede Bezeichnung klicken, um sie zu ändern.
Benennen Sie das Element und die Verbindertools um.
Öffnen Sie das DSL Explorer-Fenster, indem Sie im Lösungs-Explorer auf die darunterliegende Registerkarte klicken. Wenn es nicht angezeigt wird, zeigen Sie auf dem Menü "Ansicht" auf "Andere Fenster" und klicken Sie dann auf DSL Explorer. DSL Explorer ist nur sichtbar, wenn das DSL Definition-Diagramm das aktive Fenster ist.
Öffnen Sie das Fenster "Eigenschaften", und positionieren Sie es so, dass Sie DSL-Explorer und -Eigenschaften gleichzeitig sehen können.
Erweitern Sie im DSL-Explorer Editor, Tool-Felder, <Ihre DSL> und dann Tools.
Klicken Sie auf "ExampleElement". Dies ist das Toolboxelement, das zum Erstellen von Elementen verwendet wird.
Ändern Sie im Eigenschaftenfenster die Eigenschaft "Name " in "Person".
Beachten Sie, dass sich die Caption-Eigenschaft ebenfalls ändert.
Ändern Sie auf die gleiche Weise den Namen des ExampleRelationship-Tools in ChildLink. Ändern Sie die Caption-Eigenschaft so, dass sie keine Kopie der Name-Eigenschaft ist. Geben Sie z. B. "Untergeordneter Link" ein.
Bauen Sie das DSL neu auf.
Speichern Sie die DSL-Definitionsdatei.
Klicken Sie im Menü "Erstellen" auf "Alle T4-Vorlagen transformieren".
Drücken Sie F5. Warten Sie, bis die experimentelle Instanz von Visual Studio angezeigt wird.
Öffnen Sie in der Debuglösung in der experimentellen Instanz von Visual Studio eine Test.ftree-Modelldatei . Ziehen Sie Elemente aus der Toolbox darauf. Beachten Sie, dass sich die Beschriftungen des Tools und die Typnamen in Toobox geändert haben.
Speichern Sie die Modelldatei.
Öffnen Sie im Projektmappen-Explorer eine TT-Datei (FamilyTreeReport.tt), und ersetzen Sie Vorkommen des alten Typs und der Eigenschaftennamen durch die neuen Namen.
Stellen Sie sicher, dass der in der TT-Datei angegebene Dateiname das Testmodell angibt.
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" #>
<#@ output extension=".txt" #>
<#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Test.ftree'" #>
Generated material. Generating code in C#.
<#
// When you change the DSL Definition, some of the code below may not work.
foreach (Person person in this.FamilyTreeModel.People)
{
#>
<#= person.Name #>
<#
}
#>
- Speichern Sie die TT-Datei. Klicken Sie im Dialogfeld "Sicherheitswarnung" auf "OK ". Öffnen Sie die generierte Datei, um das Ergebnis der Ausführung des Codes in der TT-Datei anzuzeigen. Stellen Sie sicher, dass sie korrekt ist.
Schließen Sie die experimentelle Instanz von Visual Studio.
Hinzufügen von Domäneneigenschaften zu Klassen
Fügen Sie einer Domänenklasse Eigenschaften hinzu, z. B. um die Jahre der Geburt und des Todes einer Person darzustellen.
Damit die neuen Eigenschaften im Diagramm sichtbar sind, müssen Sie der Form, die das Modellelement anzeigt, Dekoratoren hinzufügen. Sie müssen die Eigenschaften auch den Dekoratoren zuordnen.
So fügen Sie Eigenschaften hinzu und zeigen sie an
Fügen Sie die Eigenschaften hinzu.
Klicken Sie im DSL-Definitionsdiagramm mit der rechten Maustaste auf die Domänenklasse "Person ", zeigen Sie auf "Hinzufügen", und klicken Sie dann auf "Domain Property".
Geben Sie eine Liste mit neuen Eigenschaftennamen ein, z. B. "BirthYear " und "DeathYear". Drücken Sie die EINGABETASTE nach jedem. Wählen Sie jede neue Domäneneigenschaft aus, und legen Sie im Eigenschaftenfenster das Feld "Typ" auf "Int32" fest.
Fügen Sie Dekoratoren hinzu, die die Eigenschaften in der Form anzeigen.
Folgen Sie der grauen Linie, die sich von der Person-Domänenklasse bis zur anderen Seite des Diagramms erstreckt. Dies ist eine Diagrammelementkarte. Sie verknüpft die Domänenklasse mit einer Shape-Klasse. Benennen Sie "ExampleShape " in "PersonShape " um, und ändern Sie das Feld "Geometry " in "RoundedRectangle " in "Properties".
Klicken Sie mit der rechten Maustaste auf diese Shape-Klasse, zeigen Sie auf "Hinzufügen", und klicken Sie dann auf "Textdekoror".
Fügen Sie zwei Dekoratoren mit Namen wie BirthDecorator und DeathDecorator hinzu. Fügen Sie einen weiteren Textdekoror mit dem Namen Strich hinzu, und legen Sie die Standardtexteigenschaft auf -- Wert fest (zwei Striche).
Wählen Sie jeden neuen Dekorateur aus, und legen Sie im Eigenschaftenfenster das Feld "Position " fest. Dadurch wird bestimmt, wo der Wert der Domäneneigenschaft auf der Form angezeigt wird. Legen Sie z. B. InnerBottomLeft und InnerBottomRight für BirthDecorator bzw. DeathDecorator fest. Legen Sie für Dash die Position-Eigenschaft auf InnerBottomCenter fest.
Ordnen Sie die Dekoratoren den Eigenschaften zu.
Öffnen Sie das DSL-Detailfenster. Sie befindet sich in der Regel auf einer Registerkarte neben dem Ausgabefenster. Wenn Sie sie nicht sehen, zeigen Sie im Menü Ansicht auf Andere Fenster und klicken Sie dann auf DSL-Details.
Klicken Sie im DSL-Definitionsdiagramm auf die Linie, die die Person-Domänenklasse mit der Shape-Klasse verbindet.
Klicken Sie in DSL-Details auf der Registerkarte Dekorateurkarten auf das Kontrollkästchen eines nicht zugeordneten Dekorators. Wählen Sie in der Eigenschaft "Anzeigen" die Domäneneigenschaft aus, der sie zugeordnet werden soll. Ordnen Sie beispielsweise "BirthDecorator " zu "BirthYear" zu. Ordnen Sie auch die DeathYear-Eigenschaft ihrem Text-Dekorateur zu.
Speichern Sie das DSL, klicken Sie im Menü "Erstellen" auf "Alle T4-Vorlagen transformieren", und drücken Sie F5.
Fügen Sie ein neues FamilyTree-Element mit dem Namen "Tudors.ftree " im Debugprojekt hinzu. Fügen Sie in Tudors.ftree-Modelldiagramm neue Personen, untergeordnete Links hinzu, und stellen Sie sicher, dass Sie jetzt auf die von Ihnen ausgewählten Positionen klicken und Werte eingeben können. Wenn Sie ein Personen-Shape auswählen, werden im Fenster "Eigenschaften" die neuen Eigenschaften "Geburtsdatum" und "Todesjahr" angezeigt.
- In einer TT-Datei können Sie Code hinzufügen, der die Eigenschaften jeder Person abruft. FamilyTreeReport.tt:
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" #>
<#@ output extension=".txt" #>
<#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Tudors.ftree'" #>
Generated material.
<#
// When you change the DSL Definition, some of the code below may not work.
foreach (Person person in this.FamilyTreeModel.People)
{
#>
<#= person.Name #> (<#= person.BirthYear #> - <#= person.DeathYear #>)
<#
}
#>
Generierte FamilyTreeReport.txt:
Generated material.
Henry VIII (1491 - 1547)
Mary I (1516 - 1558)
Elizabeth I (1533 - 1603)
Neue Klassen definieren
Sie können einem Modell Domänenklassen und Beziehungen hinzufügen. Sie können beispielsweise eine neue Klasse erstellen, um Städte darzustellen, und eine neue Beziehung, die darstellt, dass eine Person in einer Stadt lebte.
Um die verschiedenen Typen in einem Modelldiagramm voneinander unterscheiden zu können, können Sie die Domänenklassen verschiedenen Formenarten oder Shapes mit unterschiedlicher Geometrie und Farben zuordnen.
So fügen Sie eine neue Domänenklasse hinzu und zeigen sie an
Fügen Sie eine Domänenklasse hinzu, und legen Sie sie als untergeordnetes Element des Modellstamms fest.
Öffnen Sie das DSL Definition-Diagramm (DslDefinition.dsl). Klicken Sie in der Toolbox auf das Tool " Beziehung einbetten" , klicken Sie im DSL-Definitionsdiagramm auf die Stammklasse FamilyTreeModel , und klicken Sie dann in einen leeren Teil des Diagramms.
Es wird eine neue Domänenklasse angezeigt, die mit dem FamilyTreeModel mit einer Einbettungsbeziehung verbunden ist.
Legen Sie den Namen fest, z. B. Town.
Hinweis
Jede Domänenklasse außer dem Stamm des Modells muss das Ziel mindestens einer Einbettungsbeziehung sein, oder sie muss von einer Klasse erben, die das Ziel einer Einbettung ist. Aus diesem Grund ist es häufig praktisch, mithilfe des Tools "Beziehung einbetten" eine Domänenklasse zu erstellen.
Fügen Sie der neuen Klasse eine Domäneneigenschaft hinzu, z. B. Name.
Fügen Sie eine Bezugsbeziehung zwischen Person und Ort hinzu.
Klicken Sie auf das Tool "Referenzbeziehung" , klicken Sie auf "Ort", und klicken Sie dann auf "Person".
Benennen Sie die TownReferencesPersons-Relation in Residence um.
Benennen Sie Personen auf der linken Seite von Wohnsitz in Bewohner um, und Städte in Residenzen auf der rechten Seite.
Hinweis
Referenzbeziehungen stellen Querverweise von einem Teil der Modellstruktur auf einen anderen dar.
Fügen Sie ein Shape hinzu, um Städte in den Modelldiagrammen darzustellen.
Ziehen Sie ein Geometrie-Shape aus der Toolbox in das Diagramm, und benennen Sie es um, z. B. TownShape.
Legen Sie im Eigenschaftenfenster die Felder "Darstellung" der neuen Form fest, z. B. Füllfarbe und Geometrie.
Fügen Sie einen Textdekoror hinzu, um den Namen der Stadt anzuzeigen, und benennen Sie ihn "NameDecorator" um. Legen Sie die Position-Eigenschaft fest.
Ordnen Sie die Domänenklasse Town der TownShape zu.
Klicken Sie auf das Diagrammelement-Zuordnungstool, dann auf die Domänenklasse Town und anschließend auf die Formklasse TownShape.
Überprüfen Sie auf der Registerkarte „Decorator Maps“ des DSL-Detailfensters bei ausgewähltem Kartenverbinder das Kontrollkästchen „NameDecorator“ und legen Sie die Anzeigen-Eigenschaft auf „Name“ fest.
Erstellen Sie einen Verbinder, um die Beziehung zwischen Person und Städten anzuzeigen.
Ziehen Sie einen Verbinder aus der Toolbox in das Diagramm. Benennen Sie es um, und legen Sie dessen Darstellungseigenschaften fest.
Nutzen Sie das Diagrammelement-Zuordnungstool, um den neuen Verbinder mit der Beziehung zwischen Person und Stadt zu verknüpfen.
Erstellen Sie ein Elementtool zum Erstellen einer neuen Stadt.
Erweitern Sie im DSL-Explorer den Editor und dann die Toolbox-Registerkarten.
Klicken Sie mit der rechten Maustaste auf <Ihr DSL> , und klicken Sie dann auf "Neues Element hinzufügen".
Legen Sie die Name-Eigenschaft des neuen Tools fest, und legen Sie dessen Class-Eigenschaft auf Town fest.
Legen Sie die Toolbox Icon-Eigenschaft fest. Klicken Sie auf [...] und wählen Sie im Feld "Dateiname " eine Symboldatei "Ressourcen\ExampleShapeToolBitmap.bmp" aus.
Erstellen Sie ein Verbindertool zum Herstellen einer Verbindung zwischen Städten und Menschen.
Klicken Sie mit der rechten Maustaste auf <Ihr DSL> , und klicken Sie dann auf "Neues Verbindungstool hinzufügen".
Legen Sie die Name-Eigenschaft des neuen Tools fest.
Wählen Sie in der ConnectionBuilder-Eigenschaft den ResidenceBuilder aus.
Legen Sie das Toolboxsymbol fest (Datei "Ressourcen\ExampleConnectorToolBitmap.bmp").
Speichern Sie die DSL-Definition, klicken Sie auf "Alle T4-Vorlagen transformieren", und drücken Sie dann F5.
Öffnen Sie in der experimentellen Instanz von Visual Studio eine Tudors.ftree-Modelldatei. Verwenden Sie die neuen Tools, um Städte und Verbindungen zwischen Städten und Personen zu schaffen. Beachten Sie, dass Sie nur Verknüpfungen zwischen den richtigen Elementtypen erstellen können.
Erstellen Sie Code, der die Stadt auflistet, in der jede Person lebt. Textvorlagen sind eine der Stellen, an denen Sie diesen Code ausführen können. Sie können beispielsweise die vorhandene FamilyTreeReport.tt-Datei in der Debuglösung so ändern, dass sie den folgenden Code enthält:
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" #>
<#@ output extension=".txt" #>
<#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Tudors.ftree'" #>
<#
foreach (Person person in this.FamilyTreeModel.People)
{
#>
<#= person.Name #> (<#= person.BirthYear #> - <#= person.DeathYear #>)
<#if (person.Residences != null) #> Residences:<#
foreach(Town town in person.Residences) {#><#= town.Name #>,<#}
#>
<#if (person.Children.Count > 0)
{#>
Children:
<#
foreach(Person child in person.Children)
{
#>
<#= child.Name #>
<#
}
}
#>
<#
}
#>
Sie können Klassendiagramm abrufen, um die Klassenstruktur zu verstehen und in den *.tt-Dateien zu verwenden. Klicken Sie mit der rechten Maustaste auf die DomainClasses.cs (die untergeordnete Datei von DomainClasses.tt), und klicken Sie dann auf den Befehl "Klassenplandiagramm anzeigen ".
Wenn Sie die Datei *.tt speichern, wird eine untergeordnete Datei erstellt, die die Liste der Personen und ihrer Wohnsitze enthält. Weitere Informationen finden Sie unter Generieren von Code aus einer Domain-Specific Sprache.
Überprüfung und Befehle
Sie könnten dieses DSL weiter entwickeln, indem Sie Validierungseinschränkungen hinzufügen. Bei diesen Einschränkungen handelt es sich um Methoden, die Sie definieren können, um sicherzustellen, dass sich das Modell in einem korrekten Zustand befindet. Beispielsweise könnten Sie eine Einschränkung definieren, um sicherzustellen, dass das Geburtsdatum eines Kindes später als die seiner Eltern ist. Die Überprüfungsfunktion zeigt eine Warnung an, wenn der DSL-Benutzer versucht, ein Modell zu speichern, das eine der Einschränkungen unterbricht. Weitere Informationen finden Sie unter "Überprüfung in einer Domain-Specific Sprache".
Sie können auch Menübefehle definieren, die der Benutzer aufrufen kann. Befehle können das Modell ändern. Sie können auch mit anderen Modellen in Visual Studio und mit externen Ressourcen interagieren. Weitere Informationen finden Sie unter So ändern Sie einen Standardmenübefehl.
Bereitstellen des DSL
Um anderen Benutzern die Verwendung der domänenspezifischen Sprache zu ermöglichen, verteilen Sie eine Visual Studio-Erweiterungsdatei (VSIX). Dies wird erstellt, wenn Sie die DSL-Lösung erstellen.
Suchen Sie die VSIX-Datei im Ordner "bin" Ihrer Lösung. Kopieren Sie es auf den Computer, auf dem Sie es installieren möchten. Doppelklicken Sie auf diesem Computer auf die VSIX-Datei. Das DSL kann in allen Instanzen von Visual Studio auf diesem Computer verwendet werden.
Sie können das gleiche Verfahren verwenden, um das DSL auf Ihrem eigenen Computer zu installieren, damit Sie die experimentelle Instanz von Visual Studio nicht verwenden müssen.
Weitere Informationen finden Sie unter Deploying Domain-Specific Language Solutions.
Entfernen alter experimenteller DSLs
Wenn Sie experimentelle DSLs erstellt haben, die Sie nicht mehr benötigen, können Sie sie von Ihrem Computer entfernen, indem Sie die Visual Studio Experimental-Instanz zurücksetzen.
Dadurch werden alle experimentellen DSLs und andere experimentelle Visual Studio-Erweiterungen von Ihrem Computer entfernt. Dies sind Erweiterungen, die im Debugmodus ausgeführt wurden.
Dieses Verfahren entfernt keine DSLs oder andere Visual Studio-Erweiterungen, die vollständig installiert wurden, indem die VSIX-Datei ausgeführt wird.
So setzen Sie die Visual Studio Experimental-Instanz zurück
Geben Sie im Windows-StartmenüVisual Studio zurücksetzen ein, und führen Sie dann den Befehl "Microsoft Visual Studio Experimental Instance zurücksetzen" aus, entsprechend Ihrer Version von Visual Studio.
Erstellen Sie alle experimentellen DSLs oder andere experimentelle Visual Studio-Erweiterungen neu, die Sie weiterhin verwenden möchten.