Gewusst wie: Generieren von Code aus UML-Klassendiagrammen
In Visual Studio Ultimate können Sie Code von UML-Klassendiagrammen generieren, indem Sie den Befehl Code generieren verwenden. Standardmäßig generiert der Befehl einen C#-Typ für jeden UML-Typ, den Sie auswählen.Sie können dieses Verhalten ändern oder erweitern, indem Sie die Textvorlagen ändern oder kopieren, mit denen der Code generiert wird.Sie können ein anderes Verhalten für die Typen angeben, die in anderen Paketen im Modell enthalten sind.
Der Befehl Code generieren eignet sich insbesondere zum Generieren von Code für die Elementauswahl des Benutzers und zum Generieren einer Datei für die einzelnen UML-Klassen oder andere Elemente.Das folgende Bildschirmfoto zeigt z. B. zwei C#-Dateien, die aus zwei UML-Klassen generiert wurden.
Wenn Sie stattdessen Code generieren möchten, in dem die generierten Dateien keine 1:1-Beziehung mit den UML-Elementen aufweisen, können Sie Textvorlagen schreiben, die mit dem Befehl Alle Vorlagen transformieren aufgerufen werden.Weitere Informationen über diese Methode finden Sie unter Gewusst wie: Generieren von Dateien aus einem UML-Modell.
Weitere Informationen zu UML-Klassendiagrammen in Visual Studio Ultimate finden Sie in den folgenden Themen:
Verwenden des Befehls 'Code generieren'
Im folgenden Verfahren wird das Standardverhalten des Befehls Code generieren beschrieben:
So generieren Sie eine separate Datei für jedes Element
Erstellen Sie ein UML-Modell, das Klassen enthält.Sie können Stereotype auf die Modellelemente anwenden.
Weitere Informationen finden Sie unter Transformationen der Standardcodegenerierung.
Wählen Sie in einem Klassendiagramm oder in UML-Modell-Explorer Elemente aus, mit denen Sie Code generieren möchten.Es stehen Ihnen folgende Auswahlmöglichkeiten zur Verfügung:
Ein bestimmter Satz von Elementen.
Ein Paket oder das Modell, aus dessen Inhalt Code generiert werden soll.
Das Diagramm, in dem alle Elemente ausgewählt werden können.
Öffnen Sie das Kontextmenü für ein ausgewähltes Element, und wählen Sie dann Code generieren aus.
Bei der ersten Verwendung von Code generieren in einem bestimmten Modell wird ein Dialogfeld angezeigt.In diesem Dialogfeld können Sie die Codegenerierungsparameter des Modells bearbeiten.
Wählen Sie OK aus, es sei denn, Sie wissen, dass Sie diese Parameter ändern möchten.
Um später zu diesem Dialogfeld zurückzukehren, öffnen Sie das Kontextmenü für das Diagramm, und wählen Sie dann Standardeinstellungen für die Codegenerierung konfigurieren aus.Weitere Informationen finden Sie unter Anpassen des Befehls 'Code generieren'.
Dateien werden generiert, die C#-Code enthalten sind.Im Standardfall wird eine Datei für jeden Typ generiert, und die Dateien werden in einem C#-Klassenbibliotheksprojekt generiert.Sie können dieses Verhalten jedoch anpassen.Weitere Informationen finden Sie unter Anpassen des Befehls 'Code generieren'.
Einige Validierungstests werden für das Modell angewendet, um sicherzustellen, dass es in C# übersetzt werden kann.Wenn diese Tests fehlschlagen, wird eine Fehlermeldung angezeigt, und die Codegenerierung wird nicht ausgeführt.Wenn Sie einen Validierungsmenübefehl erstellt haben, wird Code für kein Element generiert, für das der Validierungsbefehl fehlschlägt.Weitere Informationen finden Sie unter Gewusst wie: Definieren von Validierungseinschränkungen für UML-Modelle.
Transformationen der Standardcodegenerierung
In diesem Abschnitt werden die Ergebnisse zusammengefasst, die vom Befehl Code generieren erzeugt werden, sofern Sie den Befehl nicht angepasst haben.Weitere Informationen finden Sie unter Anpassen des Befehls 'Code generieren'.
Ein C#-Typ wird für jeden Typ erzeugt, den Sie im UML-Modell ausgewählt haben.Jeder Typ wird in einer separaten Codedatei unter dem Ordner GeneratedCode eingefügt.
Wenn der UML-Typ in einem Paket enthalten ist, wird der generierte C#-Typ in einem Namespace platziert, und die Datei wird in einem Ordner generiert, der den gleichen Namen wie der Namespace hat.
Eine C#-Eigenschaft wird für jedes Attribute einer UML-Klasse generiert.
Eine C#-Methode wird für jede Operation eines UML-Typs generiert.
Ein C#-Feld wird für jede navigierbare Zuordnung generiert, an der die Klasse teilnimmt.
Sie können mehr Eigenschaften des generierten C#-Typs steuern, indem Sie jedem UML-Typ ein Stereotyp hinzufügen.
Zum Erstellen dieses C#-Typs |
Zeichnen Sie diesen UML-Typ |
Übernehmen Sie dieses Stereotype |
---|---|---|
Klasse |
Klasse |
<none> oder C#-Klasse |
Schnittstelle |
Schnittstelle |
<none> oder C#-Schnittstelle |
Enumeration |
Enumeration |
<none> oder C#-Enumeration |
Delegat |
Klasse |
C#-Delegat |
Struktur |
Klasse |
C#-Struktur |
So legen Sie ein Stereotyp für einen Typ oder ein anderes Element fest
Öffnen Sie das Kontextmenü für das Element in einem Diagramm oder in UML-Modell-Explorer, und wählen Sie dann Eigenschaften aus.
Im Fenster Eigenschaften wählen Sie den Dropdownpfeil in der Eigenschaft Stereotype aus, und aktivieren Sie dann das Kontrollkästchen für das Stereotyp, die Sie anwenden möchten.
Tipp Wenn die C#-Stereotype nicht angezeigt werden, aktivieren Sie das C#-Profil für das Modell oder ein Paket, das die Modellelemente enthält, für die Sie sich interessieren.Wählen Sie das Paket oder den Stamm des Modells in UML-Modell-Explorer aus.Das im Fenster Eigenschaften, wählen Sie Profil aus und aktivieren Sie dann das C#-Profil.
Erweitern Sie die Stereotypes-Eigenschaft, um die zusätzlichen Eigenschaften zu sehen, die Sie festlegen können.
Die Description-Eigenschaften von Typen, Attributen, Vorgängen und Zuordnungen werden in <summary>-Kommentare im generierten Code geschrieben.Kommentarelemente, die mit Typen verknüpft sind, werden in <remarks>-Kommentare geschrieben.
Variieren des generierten Codes
Der generierte Code unterscheidet sich je nach den Eigenschaften der einzelnen Typen, Attribute oder Vorgänge.Wenn Sie z. B. die Is Abstract-Eigenschaft einer Klasse auf "true" festlegen, wird das abstract-Schlüsselwort für die generierte Klasse angezeigt.Wenn Sie die Multiplizität eines Attributs auf 0..* festlegten, erhält die generierte Eigenschaft einen IEnumerable<>-Typ.
Außerdem stellt jedes Stereotyp mehrere zusätzliche Eigenschaften bereit, die Sie festlegen können.Diese Werte werden im C#-Code in geeignete Schlüsselwörter übersetzt.Wenn Sie z. B. die Is Static-Eigenschaft für eine Klasse festlegen, ist die C#-Klasse static.
Wählen Sie die Klasse oder ein anderes Element im Diagramm aus, um diese zusätzlichen Eigenschaften festzulegen.Erweitern Sie Stereotypes im Eigenschaftenfenster, und erweitern Sie dann das C#-Stereotyp, z. B. C#-Klasse.Für Klassen schließen diese zusätzlichen Eigenschaften Folgendes ein:
CRL-Attribute
Is Partial
Is Static
Is Unsafe
Paketsichtbarkeit
Jedes Attribut und jeder Vorgang verfügt ebenfalls über Stereotypeigenschaften, die Sie festlegen können.Wenn die Eigenschaften für ein neues Attribut nicht angezeigt werden, führen Sie Code generieren aus.
Anpassen des Befehls 'Code generieren'
Der Befehl Code generieren funktioniert, indem die Modellelemente anhand eines Satzes von Textvorlagen transformiert werden.Weitere Informationen zu Textvorlagen finden Sie unter Codegenerierung und T4-Textvorlagen.
Die Vorlagen werden in einem Satz von Textvorlagenbindungen angegeben.Eine Textvorlagenbindung gibt die anzuwendende Vorlage, den Speicherort der generierten Ausgabe und weitere Parameter des Befehls Code generieren an.
Wenn Sie den Befehl Code generieren das erste Mal für ein bestimmtes Modell ausführen, wird dem Stamm des Modells ein Standardsatz von Vorlagenbindungen angefügt.Diese Bindungen gelten für alle Elemente im Modell.
Sie können diese Standardbindungen jedoch überschreiben und durch Anfügen von eigenen Bindungen an Pakete, Klassen oder andere Elemente ergänzen.Eine Bindung gilt für alle Elemente, die in dem Element enthalten sind, an das es angefügt wird.Wenn z. B. alle Typen in einem bestimmten Paket von einem anderen Satz von Vorlagen transformiert oder in einen anderen Ordner ausgegeben werden sollen, können Sie dem Paket Vorlagenbindungen anfügen.
Um die Vorlagenbindungen zu überprüfen, die einem Modellelement zugeordnet sind, wählen Sie die Auslassungspunkte [...] in der Eigenschaft Textvorlagenbindungen im Eigenschaftenfenster.
Mit dem Befehl Code generieren werden Vorlagen auf jedes ausgewählte Modellelement angewendet.Für jedes Element ist der angewendete Satz von Vorlagen, der kombinierte Vorlagensatz, der seinen Containern angefügt wurde, einschließlich des Modellstamms.
Wenn zwei Vorlagenbindungen in diesem Satz den gleichen Namen aufweisen, überschreibt die Bindung im kleineren Container die Bindung im größeren Container.Der Modellstamm besitzt z. B. eine Bindung mit dem Namen Class Template.Definieren Sie eine eigene Vorlagenbindung mit dem Namen Class Template, um auf den Inhalt eines bestimmten Pakets eigene Vorlage anzuwenden.
Für ein Modellelement können mehrere Vorlagen übernommen werden.Sie können mehr als eine Datei aus jedem Modellelement generieren.
Hinweis |
---|
Die Bindungen am Stamm des Modells fungieren für alle Elemente im Modell als Standard.Um diese Standardbindungen anzuzeigen, öffnen Sie das Kontextmenü für die Diagrammoberfläche, und wählen Sie dann Standardeinstellungen für die Codegenerierung konfigurieren aus.Alternativ können Sie den Stamm des Modells im UML-Modell-Explorer auswählen und dann [...] in der Eigenschaft Textvorlagenbindungen aus.Die Bindungen werden erst angezeigt, wenn Sie mindestens einmal den Befehl Code generieren verwendet haben.Vorlagenbindungen können keinem Diagramm angefügt werden. |
So fügen Sie Textvorlagenbindungen an ein Paket oder anderes Modellelement an
In UML-Modell-Explorer öffnen Sie das Kontextmenü für ein Modellelement, und wählen Sie dann Eigenschaften aus.Im Allgemeinen fügen Sie Textvorlagenbindungen einem Paket oder dem Stamm des Modells an.
Im Eigenschaften Sie im auf die Schaltfläche mit den Auslassungspunkten ([...]) in der Eigenschaft Textvorlagenbindungen aus.
Das Dialogfeld Text Template Bindings (Textvorlagenbindungen) wird angezeigt.
Wählen Sie Hinzufügen, um eine neue Textvorlagenbindung zu erstellen.
- oder -
Wählen Sie eine vorhandene Bindung, um sie zu bearbeiten.
Jede Vorlagenbindung definiert, wie eine angegebene Vorlage für das ausgewählt Modellelement und andere darin enthaltene Modellelemente übernommen werden soll.
Legen Sie im Dialogfeld die Eigenschaften der Textvorlagenbindung fest.
Eigenschaft
Beschreibung
Name
Ein Name für diese Bindung.Um eine von einem enthaltenden Paket oder Modell geerbte Bindung zu überschreiben, verwenden Sie den gleichen Namen wie die Bindung, die Sie überschreiben möchten.
Overwrite
Bei "true" wird jeder vorhandener Code überschrieben.
Target Name
Der Name der generierten Datei.
Sie können Ausdrücke in diese Zeichenfolge einfügen (z. B. {Name} oder {Owner.Name}).Sie könnten z. B. Folgendes schreiben: {Owner.Name}_{Name}.Der Ausdruck wird für das Modellelement ausgewertet.Eigenschaften von Elementen, jedoch keine Methoden können verwendet werden.Welche Eigenschaften verwendet werden können, finden Sie unter den Eigenschaften der Typen in Microsoft.VisualStudio.Uml.*.
Wichtig{Name} oder {Owner.Name} kann nur in der Target Name-Eigenschaft verwendet werden.Um den Namen der generierten Klasse zu ändern, müssen Sie die Vorlage ändern.Weitere Informationen finden Sie unter Schreiben einer Textvorlage.Project Path
Gibt den Pfad zum Visual Studio-Projekt an, das die Ausgabedateien der Transformation enthält.Verwenden Sie typisierte Werte, um ein neues Projekt zu erstellen.Wählen Sie die Schaltfläche mit den Auslassungspunkten ()[...] um ein vorhandenes Projekt auszuwählen.
Falls noch nicht vorhanden, wird ein neues Projekt erstellt.Es ist ein C#-Klassenbibliotheksprojekt.
Hierzu müssen Sie das Projekt direkt eingeben.Sie können Umgebungsvariablenmakros wie %ProgramFiles% oder %LocalAppData% einschließen.
Target Directory
Der Ordner, in dem die Zieldatei generiert wird.Der Pfad ist relativ zum Projektordner.
Sie können mithilfe des {PackageStructure}-Ausdrucks einen Pfad einfügen, der den Namen der enthaltenden Pakete entspricht.Der Standardwert ist \GeneratedCode\{PackageStructure}.Sie können auch Umgebungsvariablen wie %TEMP% oder %HomePath% einschließen.
Wichtig{PackageStructure} kann nur in der Target Directory-Eigenschaft verwendet werden.Vorlagendatei-Pfad
Die Vorlage, mit der die Transformation ausgeführt wird.
Sie können entweder die bereitgestellten Vorlagen verwenden oder eigene erstellen.Sie können die bereitgestellten Vorlagen im folgenden Speicherort finden:
…\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Architecture Tools\Extensibility\Templates\Text\
Sie können einem Element beliebig viele Bindungen anfügen.
Schreiben einer Textvorlage
Sie können eigene Textvorlagen schreiben.Textvorlagen können Programmcode oder eine beliebige andere Art von Textdatei generieren.
Beginnen Sie am besten, indem Sie Kopien der Standardvorlagen ändern.Sie können die Vorladen aus den folgenden Speicherorten kopieren:
…\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Architecture Tools\Extensibility\Templates\Text\
Erläuterungen zu den Textvorlagen finden Sie unter den folgenden Themen.
Eine Textvorlage ist ein Prototyp der resultierenden Datei und enthält sowohl den resultierenden Text als auch den Programmcode, der das Modell liest.Weitere Informationen finden Sie unter Codegenerierung und T4-Textvorlagen.
Sie müssen die UML-API verwenden, um im Programmcode im Modell zu navigieren.Weitere Informationen finden Sie unter Gewusst wie: Navigieren im UML-Modell und API-Referenz für UML-Modellierungserweiterbarkeit.
Sie müssen Sie die Modeling-Direktive einschließen, um die Vorlagen mit dem Befehl Code generieren verwenden zu können.Beispiel:
<#@ Modeling ElementType="Microsoft.VisualStudio.Uml.Classes.IClass" Processor="ModelingProcessor" #>
Das ElementType-Attribut definiert den Typ des UML-Elements, auf das diese Vorlage angewendet wird.
In der Vorlage gehört this zu einer temporären Klasse, die über die folgenden Eigenschaften verfügt:
Element = das UML-IElement, auf das die Vorlage angewendet wird.
Errors: CompilerErrorCollection
ModelBus: ModelBus.Weitere Informationen finden Sie unter Gewusst wie: Integrieren von UML-Modellen in andere Modelle und Tools.
ProfileName = "C#Profile"
ServiceProvider: IServiceProvider
Session: TextTemplatingSession.
Store: Store.Dies ist der Visualisierungs- und Modellierungs-SDK-Speicher, für den der UML-Modellspeicher implementiert wird.Verwenden Sie this.Element.GetModelStore() zum Abrufen des UML-IModelStore.
Die folgenden Punkte können beim Schreiben der Textvorlage hilfreich sein.Diese Informationen werden in Detail in Codegenerierung und T4-Textvorlagen beschrieben.
Sie können die Dateinamenerweiterung des Ergebnisses in der Output-Direktive festlegen.Eine Output-Direktive ist in jeder Textvorlage erforderlich.
Die Vorlage verweist automatisch auf einige Assemblys.Diese Assemblys schließen z. B. "System.dll" und "Microsoft.VisualStudio.Uml.Interfaces.dll" ein.
Für die Verwendung anderer Assemblys im generierenden Programmcode müssen Sie eine Assembly-Direktive verwenden.Beispiel:
<#@ Assembly Name="%ProgramFiles%\Microsoft Visual Studio 11.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.ArchitectureTools.Extensibility.dll" #>
Einige Namespaces wie System werden automatisch in den Programmcode importiert.Für andere Namespaces können Sie die Import-Direktive auf die gleiche Weise verwenden wie eine using-Anweisung.Beispiel:
<#@ Import Namespace="Microsoft.VisualStudio.Uml.Classes" #>
<#@ Import Namespace="Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml" #>
Verwenden Sie die Include-Direktive, um auf den Text einer anderen Datei zu verweisen.
Die in Klammern <# ... #> eingeschlossenen Teile der Vorlage werden mit dem Befehl Code generieren ausgeführt.Teile der Vorlage außerhalb dieser Klammern werden in die Ergebnisdatei kopiert.Es ist wichtig, zwischen dem generierenden Code und dem generierten Text zu unterscheiden.Der generierte Text kann jeder Sprache aufweisen.
<#= Expressions #> werden ausgewertet und in Zeichenfolgen konvertiert.
Siehe auch
Konzepte
UML-Klassendiagramme: Referenz