Sdílet prostřednictvím


Porozumění kódu DSL

Řešení specifické pro doménu jazyk (DSL) generuje rozhraní API, které můžete použít ke čtení a aktualizovat instance DSL v Visual Studio.Toto rozhraní API je definována v kódu, který je generován z definice DSL.Toto téma popisuje generovaného rozhraní API.

Příklad řešení: diagramy komponent

Chcete-li vytvořit řešení, které jsou zdrojem většina z příkladů v tomto tématu, vytvořte DSL z modely součástí šablona řešení.Toto je jedním z standardní šablony, které se zobrazí, když vytvoříte nové řešení pro DSL.

[!POZNÁMKA]

Šablony součástí diagramy DSL nesouvisí s diagramů UML součásti, které je možné vytvořit pomocí nabídky architektury v Visual Studio Ultimate.V nový projekt dialogové okno rozbalte další projekt Types\Extensibility a potom klikněte na tlačítko Designer jazyka specifické pro doménu.

Stisknutím klávesy F5 a testu, pokud si nejste známé touto šablonou řešení.Všimněte si zejména vytvořit portů přetažením nástroj port na součásti a zda se můžete připojit porty.

Komponenty a propojené portů

Strukturu řešení DSL

Dsl Projektu definuje rozhraní API pro vaše DSL.DslPackage Projektu definuje, jak je integrována se službou Visual Studio.Můžete také přidat vlastní projektů, které mohou obsahovat také kód generovaný z modelu.

Kód adresáře

Většina kódu v každé z těchto projektů, je vygenerována Dsl\DslDefinition.dsl.Generovaný kód je v Generated Code složky.Vygenerovaný soubor zobrazíte klepnutím na tlačítko [+] vedle generování .tt souboru.

Doporučujeme, aby si prohlédnout generovaného kódu, který vám pomůže pochopit DSL.Chcete-li zobrazit soubory, rozbalte v Průzkumníku řešení soubory *.tt.

Soubory *.tt obsahují velmi malé generování kódu.Použijte místo toho <#include> direktivy tak, aby obsahoval soubory sdílené šablony.Sdílené soubory lze nalézt v**\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates**

Přidáte-li k řešení DSL vlastní programový kód, přidejte je do samostatného souboru mimo složku vygenerovaném kódu.Chcete vytvořit Custom Code složky.(Při přidání nového souboru kódu do vlastní složky, nezapomeňte, chcete-li opravit obor názvů v kostru počátečního kódu.)

Důrazně doporučujeme, aby neprovedete úpravy generovaný kód přímo, protože vaše úpravy budou ztraceny, když je znovu vytvořit řešení.Místo toho chcete-li přizpůsobit vaše DSL:

  • Umožňuje upravte mnoho parametrů v definici DSL.

  • Částečné třídy v souborech samostatné kódu pro zápis do přepsání metody, které jsou definovány v nebo zděděna generované třídy.V některých případech je nutné nastavit generuje dvojité odvozen možnost třídy v definici DSL, aby bylo možné přepsat metodu generované.

  • Nastavení možností v definici DSL, které způsobují generovaný kód pro zajištění 'zachytávání' vlastního kódu.

    Nastavíte-li například má vlastní konstruktor možnost třídy domény a začnete vytvářet řešení, zobrazí se chybové zprávy.Když poklepejte na jednu z těchto chybových zpráv, zobrazí se komentáře do generovaného kódu, které popisují, co by měl nabídnout váš vlastní kód.

  • Napište vlastní text šablony pro generování kódu, které jsou specifické pro vaši aplikaci.Můžete mohou zahrnovat použití soubory ke sdílení částí šablon, které jsou společné pro mnoho projektů a můžete vytvářet Visual Studio šablony lze nastavit projektů, které jsou inicializovány s strukturu souboru projektu.

Generované soubory v Dsl

Následující soubory se zobrazí v Dsl projektu.

Název souboru

Popis

YourDslSchema.xsd

Schéma pro soubory, které obsahuje instance vaše DSL.Tento soubor bude zkopírován do kompilace (bin) adresář.Při instalaci vaše DSL, můžete zkopírovat tento soubor a \Program Files\Microsoft Visual Studio 11.0\Xml\Schemas tak, aby soubory modelu může být ověřen.Další informace naleznete v tématu Nasazování řešení jazyka specifického pro doménu.

Pokud upravíte serializace pomocí nastavení možností v Průzkumníku DSL, schéma se změní.Však pokud píšete kód serializace, tento soubor může být již představovat skutečné schéma.Další informace naleznete v tématu Přizpůsobení souborového úložiště a serializace XML.

ConnectionBuilders.cs

Tvůrce připojení je třída, která vytvoří relace.Je kód pro nástroj připojení.Tento soubor obsahuje dvojice tříd pro jednotlivé nástroje připojení.Jejich názvy jsou odvozeny od názvy nástroj relace a připojení k doméně: vztahtvůrce, a ConnectorToolConnectAction.

(V příkladu součásti řešení pro jeden z počítačů připojení se nazývá ConnectionBuilder, toto je shoda, protože vztah domény je pojmenované připojení.)

Relace je vytvořen ve vztahBuilder.Connect() metody.Výchozí verze ověří, zda jsou přijatelné zdrojová a cílová prvky modelu a poté vytvoří relaci.Příklad:

CommentReferencesSubject(sourceAccepted, targetAccepted);

Každá třída tvůrce, je vygenerována uzel ve připojení Tvůrce oddíl v Průzkumníku DSL.Jeden Connect metoda ji může vytvořit vztahy mezi jeden nebo více dvojice domain tříd.Každý pár je definován pomocí odkazu připojit direktivu, které můžete najít v Průzkumníku DSL pod uzlem Tvůrce.

Můžete například přidat do jednoho připojení Tvůrce direktivy připojit odkaz pro každý ze tří typů vztahů v ukázce DSL.To by poskytnout uživateli nástroj jediného připojení.Typ vztahu k vytvoření budou záviset na typy elementů zdrojová a cílová vybranou uživatelem.Chcete-li přidat odkaz připojit direktivy, klikněte pravým tlačítkem myši tvůrce v Průzkumníku DSL.

Chcete-li napsat vlastní kód, který se spustí, jakmile je vytvořen určitý typ vztahu domény, vyberte odpovídající odkaz připojit direktiva pod uzlem Tvůrce.V okně Vlastnosti nastavte používá vlastní připojení.Znovu sestavte řešení a potom zadejte kód, který má výsledný chyby opravte.

Chcete-li napsat vlastní kód, který spustí vždy, když uživatel používá nástroj pro toto připojení, nastavte je vlastní vlastnost daného Tvůrce připojení.Můžete zadat kód, který rozhodne, zda je povolen prvek zdroje, zda konkrétní kombinaci zdroje a cíl je povolen a které aktualizace je třeba modelu při vytvoření připojení.Například může povolit připojení, pouze v případě, že by smyčka vytváří v diagramu.Namísto odkaz na jednu relaci může vytvořit instanci složitější vzor několik vzájemně souvisejících prvků mezi zdrojovou a cílovou.

Connectors.cs

Obsahuje třídy pro konektory, které jsou elementy diagramu, které obvykle představují referenční relace.Každá třída je generován z jednoho konektoru v definici DSL.Každé třídy konektor je odvozen odBinaryLinkShape

Chcete-li barvu a některé další funkce proměnné stylu za běhu, klikněte pravým tlačítkem myši třídy na diagramu DSL definice a přejděte na přidat zveřejněné.

Chcete-li další styl funkce proměnné v době běhu, viz například TextField a ShapeElement.

Diagram.cs

Obsahuje třídy, která definuje diagramu.Je odvozen od Diagram.

Chcete-li barvu a některé další funkce proměnné stylu za běhu, klikněte pravým tlačítkem myši třídy na diagramu DSL definice a přejděte na přidat zveřejněné.

Kromě toho tento soubor obsahuje FixupDiagram pravidlo, které odpovídá při přidání nového elementu do modelu.Pravidlo přidá nový tvar a tvar, který odkazuje na prvek modelu.

DirectiveProcessor.cs

Tato direktiva procesoru pomáhá uživatelům k zápisu text šablony, které instance vaše DSL pro čtení.Načte sestavení (DLL) pro vaše DSL direktivy procesoru a efektivně vloží using příkazy pro obor názvů.To umožňuje kódu v šablonách textu pro použití třídy a vztahy, které jste určili ve vaší DSL.

Další informace naleznete v tématu Vytváření kódu z jazyka specifického pro doménu a Vytváření vlastních procesorů pro direktivy textových šablon T4.

DomainClasses.cs

Implementace třídy domény, které jste určili, včetně abstraktní třídy a kořenová třída modelu.Jsou odvozeny od ModelElement.

Každá třída domény obsahuje:

  • Definice vlastnosti a třídu vnořené obslužnou rutinu pro každou vlastnost domény.Můžete přepsat OnValueChanging() a OnValueChanged().Další informace naleznete v tématu Obslužná rutina změny hodnoty vlastnosti domény.

    V příkladu DSL Comment třída obsahuje vlastnost Text a třídu obslužné rutiny TextPropertyHandler.

  • Přistupující objekt vlastnosti vztahů, kterých se účastní této třídy domény.(Není žádný vnořené třídy pro vlastnosti rolí.)

    V příkladu DSL Comment třída má přistupující objekty, které přistupují k jeho nadřazeného modelu prostřednictvím vnoření vztahu ComponentModelHasComments.

  • Konstruktory.Pokud chcete tyto přepsat, nastavte má vlastní konstruktor na třídu domény.

  • Element skupiny prototypu (EGP) obslužnými rutinami.Je to nutné, pokud uživatel může sloučení (Přidat) jiného elementu do instance této třídy.Obvykle uživatel to přetažením z nástroj pro element nebo jiného obrazce nebo vložením.

    V příkladu může být DSL, Port vstupní nebo výstupní Port sloučeny do součásti.Navíc komponenty a komentáře mohou být sloučeny do modelu.Rozhraní

    Metody obslužné rutiny EGP ve třídě komponenty umožní součásti pro příjem porty, ale není komentáře.Obslužná rutina EGP ve třídě modelu kořenový přijme komentáře a součásti, ale není porty.

DomainModel.cs

Třída, která představuje model domény.Je odvozen od DomainModel.

[!POZNÁMKA]

Nejedná se stejná jako kořenová třída modelu.

Zkopírovat a odstranit uzavřené definovat, jaké další prvky by měly být zahrnuty při elementu je zkopírovat nebo odstranit.Toto chování můžete řídit nastavením šíří kopie a šíří odstranit Vlastnosti rolí na každé straně každé relaci.Pokud chcete hodnoty, které mají být určena dynamicky, budete psát kód k přepsání metod třídy uzavření.Další informace naleznete v tématu Postupy: Chování programového zkopírování a vložení – přesměrování.

DomainModelResx.resx

Tato položka obsahuje řetězce, například popisy domény třídy a vlastnosti, názvy vlastností, popisky nástrojů, standardní chybové zprávy a další řetězce, které by mohl být zobrazen uživateli.Obsahuje také ikony nástroje a obrázky pro tvary obrázku.

Tento soubor je vázán do vytvořený sestavení a poskytuje výchozí hodnoty z těchto prostředků.Je možné lokalizovat vaše DSL vytvořením satelitní sestavení, který obsahuje lokalizované verze prostředků.Tato verze bude použit při instalaci DSL v jazykové verzi odpovídající lokalizované zdroje.Další informace naleznete v tématu Nasazování řešení jazyka specifického pro doménu.

DomainRelationships.cs

Každý propojení mezi dvěma prvky v modelu je reprezentována instance třídy vztah domény.Všechny třídy relace jsou odvozeny od ElementLink, který je zase odvozen z ModelElement.Protože se jedná ModelElement, instance relace může mít vlastnosti a může být zdroj nebo cíl v relaci.

HelpKeywordHelper.cs

Poskytuje funkce, které se používají při stisknutí klávesy F1.

MultiplicityValidation.cs

V oblasti role vztahu, kde zadáte násobnost 1..1 nebo 1.. *, uživatel by měl být upozorněn tohoto alespoň jednu instanci relace je třeba zadat.Tento soubor poskytuje ověření omezení, které implementují těchto upozornění.Odkaz na 1..1 má vnoření nadřazený není ověřen.

Pro tyto omezení, které mají být provedeny, je nutné mít nastavit jednu z používá... možností v Editor\Validation uzel v Průzkumníku DSL.Další informace naleznete v tématu Ověřování v jazyce specifickém pro doménu.

PropertiesGrid.cs

Tento soubor obsahuje kód pouze v případě, že připojené popisovač typu vlastní vlastnosti domény.Další informace naleznete v tématu Přizpůsobení okna Vlastnosti.

SerializationHelper.cs

  • Metoda ověření zajistit, že žádné dva elementy není odkazováno pomocí stejného zástupný název.Další informace naleznete v tématu Přizpůsobení souborového úložiště a serializace XML.

  • Třída SerializationHelper, která poskytuje funkce, které se používají v běžných třídami serializace.

Serializer.cs

Serializátor třída pro každou třídu doménové, relaci, tvar, konektor, diagramu a modelu.

Mnoho funkcí těchto tříd lze řídit pomocí nastavení v Průzkumníku DSL pod chování serializace Xml.

Shapes.cs

Třída pro všechny třídy tvar v definici DSL.Tvary jsou odvozeny od NodeShape.Další informace naleznete v tématu Přizpůsobení souborového úložiště a serializace XML.

Chcete-li přepsat metody vygenerovaný pomocí vlastních metod ve třídě částečné, nastavte generuje dvojité odvozen pro konektor v definici DSL.Chcete-li nahradit konstruktor vlastního kódu, nastavte má vlastní konstruktor.

Chcete-li barvu a některé další funkce proměnné stylu za běhu, klikněte pravým tlačítkem myši třídy na diagramu DSL definice a přejděte na přidat zveřejněné.

Chcete-li další styl funkce proměnné v době běhu, viz například TextField aShapeElement

ToolboxHelper.cs

Nastaví pomocí instalace prototypy skupiny element do elementu nástroje panelu nástrojů.Kopie těchto prototypů jsou sloučeny s cílových elementů, když uživatel spustí tento nástroj.

Může přepsat CreateElementPrototype() k definování položka panelu nástrojů, které vytvoří skupinu několika objektů.Můžete například definovat položku k reprezentování objekty, které mají dílčí součásti.Po změně kódu, resetovat pokusné instance Visual Studio k vymazání mezipaměti na panelu nástrojů.

Generované soubory v projektu DslPackage

DslPackage páry v odstupu DSL modelu, který má Visual Studio prostředí, Správa příkazů okno, nástrojů a nabídky.Většina tříd, jsou dvojité odvozen, takže můžete přepsat své metod.

Název souboru

Popis

CommandSet.cs

Příkazy nabídky kontextu, které jsou zobrazeny na diagramu.Můžete přizpůsobit nebo přidat do této sady.Tento soubor obsahuje kód pro příkazy.Umístění příkazů v nabídkách je dáno Commands.vsct souboru.Další informace naleznete v tématu Zápis uživatelských příkazů a akcí.

Constants.cs

Identifikátory GUID.

DocData.cs

YourDslDocData spravuje načítání a ukládání modelu do souboru a vytvoří instanci úložiště.

Například pokud chcete uložit vaše DSL do databáze místo do souboru, může přepíšete Load a Save metody.

DocView.cs

YourDslDocView spravuje do okna, ve kterém se zobrazí diagramu.Například může vložit diagramu v rámci systému windows formuláře:

Přidejte do projektu DslPackage soubor uživatelského ovládacího prvku.Přidáte Panel, ve kterém mohou být zobrazeny diagramu.Přidáte tlačítek a jiných ovládacích prvků.V zobrazení kódu formuláře přidejte následující kód, úprava jména vaše DSL:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Shell;
namespace Company.EmbedInForm
{
  public partial class UserControl1 : UserControl
  {
    public UserControl1()
    {
      InitializeComponent();
    }
    
    private DiagramDocView docView;
    public UserControl1(DiagramDocView docView, Control content)
      : this()
    {
      this.docView = docView;
      panel1.Controls.Add(content);
    }
    private void button1_Click(object sender, EventArgs e)
    {
      ExampleModel modelRoot = this.docView.CurrentDiagram.ModelElement as ExampleModel;
      foreach (ExampleElement element in modelRoot.Elements)
      {
       listBox1.Items.Add(element.Name);
      }
    }
  }
  internal partial class EmbedInFormDocView
  {
    private ContainerControl container;
    /// <summary>
    /// Return a User Control instead of the DSL window. 
    /// The user control will contain the DSL window.
    /// </summary>
    public override System.Windows.Forms.IWin32Window Window
    {
      get
      {
        if (container == null)
        {
          // Put the normal DSL Window inside our control
          container = new UserControl1(this, (Control)base.Window);
        }
        return container;
      }
    }
  }
}

EditorFactory.cs

Vytvoří DocData a DocView.Ji splňuje všechny standardní rozhraní, které Visual Studio používá k otevření editoru při spuštění balíčku DSL.Se odkazuje ProvideEditorFactory atribut v Package.cs

GeneratedVSCT.vsct

Vyhledá standardní příkazy v nabídkách, jako je například místní nabídky diagramu upravit nabídky a tak dále.Kód pro příkazy je v CommandSet.cs.Můžete změnit umístění nebo upravit standardní příkazy, a můžete přidat vlastní příkazy.Další informace naleznete v tématu Zápis uživatelských příkazů a akcí.

ModelExplorer.cs

Definuje Průzkumníka modelu pro vaše DSL.Jedná se o zobrazení stromu modelu, který uživateli se zobrazí vedle diagramu.

Například může přepsat InsertTreeView() Chcete-li změnit pořadí, ve kterém elementy se zobrazí v Průzkumníku modelu.

Pokud chcete výběr v Průzkumníku modelu pro zachování synchronizované s výběru diagramu, můžete použít následující kód:

protected override void OnSelectionChanged(global::System.EventArgs e)
{
base.OnSelectionChanged(e);
// get the selected element
DslModeling::ModelElement selectedElement = 
this.PrimarySelection as DslModeling::ModelElement;
// Select in the model explorer
SelectInModelExplorer<YOURLANGUAGEExplorerToolWindow>(selectedElement);
}
private void SelectInModelExplorer<T>(DslModeling::ModelElement modelElement)
where T : DslShell.ModelExplorerToolWindow
{
DslShell::ModelingPackage package = 
this.GetService(typeof(VSShell.Package)) as DslShell::ModelingPackage;
if (package != null)
{
// find the model explorer window
T explorerWindow = package.GetToolWindow(typeof(T), true) as T;
if (explorerWindow != null)
{
// get the tree container
DslShell.ModelExplorerTreeContainer treeContainer = 
explorerWindow.TreeContainer;
// find the tree node
DslShell.ExplorerTreeNode treeNode = 
treeContainer.FindNodeForElement(modelElement);
// select the node
explorerWindow.TreeContainer.ObjectModelBrowser.SelectedNode = treeNode;
}
}
}

ModelExplorerToolWindow.cs

Definuje okna, ve kterém je zobrazen Průzkumník modelu.Zpracuje výběr položek v Průzkumníku.

Package.cs

Tento soubor definuje, jak DSL integruje do Visual Studio.Atributy pro třídu balíčku zaregistrovat DSL jako obslužná rutina pro soubory, které mají své příponu souboru, definovat jeho nástrojů a určit, jak otevřete nové okno.Metodu Initialize() je volána jednou, pokud je první DSL načtena do Visual Studio instance.

Source.extension.vsixmanifest

Chcete-li přizpůsobit tento soubor, upravte .tt souboru.

Poznámka k upozorněníUpozornění

Pokud upravíte soubor .tt tak, aby obsahoval materiály, jako jsou ikony nebo obrázky, ujistěte se, že prostředek je zahrnuta v souboru VSIX sestavení.V Průzkumníku řešení vyberte soubor a ujistěte se, že zahrnout v souboru VSIX je vlastnost True.

Tento soubor Určuje, jak DSL je zabalen do Visual Studio integrace rozšíření (VSIX).Další informace naleznete v tématu Nasazování řešení jazyka specifického pro doménu.

Viz také

Koncepty

Jak se definuje jazyk specifický pro doménu

Porozumění modelům, třídám a vztahům

Přizpůsobení a rozšíření jazyka specifického pro doménu

Další zdroje

Zápis kódu pro úpravu jazyka specifického pro doménu