Sdílet prostřednictvím


Principy kód DSL

Roztok domény specifické pro jazyk (DSL) generuje rozhraní API, které lze číst 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é API.

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

Chcete-li vytvořit řešení, které je zdrojem většiny příklady v tomto tématu Vytvoření DSL z Součást modely roztok šablony.To je jedna standardní šablony, které se zobrazí při vytváření nové řešení DSL.

[!POZNÁMKA]

Šablona DSL diagramy komponent nesouvisí s diagramy komponent UML, které vytvoříte pomocí nabídky architektury v Visual Studio Ultimate.V Nový projekt dialogové okno pole, rozbalte položku Další projekt Types\Extensibility a klepněte na tlačítko Designer domény specifické pro jazyk.

Stisknutím klávesy F5 a experimentu, pokud nejste obeznámeni s touto šablonou řešení.Všimněte si zejména vytvoříte přetažením nástroje port součást porty a připojení porty.

Součásti a vzájemně propojených porty

Strukturu řešení DSL

Dsl Projektu definuje rozhraní API pro váš modem DSL.DslPackage Projektu definuje, jak integruje s Visual Studio.Můžete také přidat vlastní projekty, které mohou obsahovat také kód generovaný z modelu.

Bb286947.collapse_all(cs-cz,VS.110).gifKód adresářů

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

Doporučujeme zkontrolovat generovaný kód vám pomohou porozumět modem DSL.Chcete-li zobrazit vygenerované soubory rozbalte soubory *.tt v aplikaci Solution Explorer.

*.Tt soubory obsahují jen velmi málo generování kódu.Použijte místo toho <#include> směrnic zahrnout soubory sdílené šablony.Sdílené soubory najdete v**\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates**

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

Důrazně doporučujeme, upravovat kód generovaný přímo, protože úpravy budou ztraceny znovu vytvořit řešení.Místo toho upravit své DSL:

  • Nastavte mnoho parametrů v definici DSL.

  • Zapisovat částečné třídy v kódu samostatné soubory přepsat metody, které jsou definovány v nebo zděděny vygenerované třídy.V některých případech je nutné nastavit Generuje dvojité odvozené možnost třídy v definici DSL s cílem potlačit generovaných metodou.

  • Nastavte volby v definici DSL, která způsobují generovaný kód "háčky" stanovit vlastní kód.

    Nastavíte-li například Má vlastní konstruktor možnost třídy domény a potom vytvořit řešení, zobrazí se chybové zprávy.Poklepete-li jeden z těchto chybových zpráv, zobrazí se komentáře do generovaného kódu, které vysvětlují, co by měla poskytnout vlastní kód.

  • Napište vlastní text šablony pro generování kódu, které jsou specifické pro vaše aplikace.Je mohou zahrnovat použití soubory sdílet částí šablon, které jsou společné mnoha projektů a můžete vytvořit Visual Studio projektu šablony k nastavení projektů, které jsou inicializovány s vlastní strukturu souboru.

Soubory generované ve Dsl

Zobrazí se následující soubory v Dsl projektu.

Název souboru

Description

YourDslSchema.xsd

Schéma pro soubory obsahující instance vaše DSL.Tento soubor je zkopírován do kompilace (bin) adresáře.Při instalaci aplikace DSL můžete zkopírovat tento soubor na \Program Files\Microsoft Visual Studio 11.0\Xml\Schemas tak, aby soubory modelu nelze ověřit.Další informace naleznete v tématu Zavedení řešení domény specifické pro jazyk.

Pokud upravíte serializace nastavením možností v aplikaci Explorer DSL, schématu se změní.Však zápisu kódu serializace tento soubor může být již představují skutečné schématu.Další informace naleznete v tématu Přizpůsobení souboru úložiště a serializace XML.

ConnectionBuilders.cs

Tvůrce spojovacích je třída, která vytvoří vztah.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ázvů domény nástroj vztah a připojení: vztahtvůrce a ConnectorToolConnectAction.

(V příkladu řešení součást jednoho připojení počítačů se nazývá ConnectionBuilder, je shoda, protože vztah domény s názvem připojení.)

Bude vytvořen vztah v vztahBuilder.Connect() metoda.Výchozí verze ověří, zda prvky modelu zdroj a cíl jsou přijatelné a poté vytvoří instanci vztah.Příklad:

CommentReferencesSubject(sourceAccepted, targetAccepted);

Každá třída Tvůrce je generován z uzlu v Připojení počítačů části v aplikaci Explorer DSL.Jeden Connect metody můžete vytvářet relace mezi dvojicemi jednu nebo více tříd domény.Každý pár je definován směrnicí propojení připojení, které můžete najít v uzlu builder v aplikaci Explorer DSL.

Například můžete přidat připojení Tvůrce jeden odkaz připojit směrnic pro každou ze tří typů vztahů ve vzorku DSL.To by poskytnout uživateli nástroj jediného připojení.Typ instance vztahu budou záviset na typy prvků zdrojové a cílové vybrané uživatelem.Chcete-li přidat odkaz připojit směrnic tlačítkem builder v aplikaci Explorer DSL.

Vyberte příslušné propojení připojit směrnice uzlu Tvůrce psát vlastní kód, který se spustí, jakmile je vytvořen určitý typ vztah domény.V okně Vlastnosti nastavit Připojení používá vlastní.Roztok znovu a potom zadejte kód výsledné chyby.

Chcete-li napsat vlastní kód, který se spustí vždy, když uživatel používá tento nástroj připojení, nastavte Je vlastní vlastnost Tvůrce připojení.Můžete zadat kód, který rozhodne, zda zdrojový prvek je povolen, zda konkrétní kombinaci zdroj cíl je povoleno a co aktualizace provedení modelu při připojení.Nelze například povolit připojení pouze v případě, že by vytvořit smyčky v diagramu.Namísto odkazu jeden vztah nelze vytvořit instanci složitější vzorek několik prvků provázané mezi zdrojovou a cílovou.

Connectors.cs

Obsahuje třídy pro spojnice, které obvykle představují referenční vztahy prvky diagramu.Každá třída je generováno z jednoho konektoru v definici DSL.Každé třídy konektor je odvozen zBinaryLinkShape

Barva a některé proměnné stylu funkce za běhu, pravým tlačítkem myši na třídu v diagramu definice DSL a přejděte na Přidat vystaveni.

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

Diagram.cs

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

Barva a některé proměnné stylu funkce za běhu, pravým tlačítkem myši na třídu v diagramu definice DSL a přejděte na Přidat vystaveni.

Kromě toho tento soubor obsahuje FixupDiagram pravidlo, které odpovídá při přidání nového prvku modelu.Pravidlo přidá nový tvar a propojuje obrazec k prvku modelu.

DirectiveProcessor.cs

Tato směrnice procesoru pomáhá uživatelům psát text šablony, které číst instanci vaše DSL.Směrnice procesor načte sestavení (DLL) pro váš modem DSL a účinně vloží using příkazy oboru názvů.To umožňuje kód v textu šablony pomocí tříd a vztahů, které jste definovali ve vašem DSL.

Další informace naleznete v tématu Generování kódu z domény specifické pro jazyk a Vytvoření vlastní T4 Text šablony směrnice procesorů.

DomainClasses.cs

Implementace třídy domény, které jste definovali, včetně abstraktní třídy a kořenová třída modelu.Pochází z ModelElement.

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

  • Definice vlastností a obsluhu vnořené třídy pro každou vlastnost domény.Můžete přepsat, OnValueChanging() a OnValueChanged().Další informace naleznete v tématu Domény vlastnost hodnotu změnit obsluhy.

    V příkladu DSL Comment třída obsahuje vlastnost Text a popisovač třídy TextPropertyHandler.

  • Přístupový objekt vlastnosti vztahy, kterých se účastní této třídy domény.(Neexistuje žádné vnořené třídy pro vlastnosti rolí.)

    V příkladu DSL Comment třída má přístupové objekty, které jeho nadřazeného modelu přístup prostřednictvím vkládání vztah ComponentModelHasComments.

  • Konstruktory.Pokud chcete přepsat, Má vlastní konstruktor na třídě domény.

  • Metody zpracování skupiny prototypu (EGP) prvek.Jsou nezbytné, pokud se uživatel může korespondence (Přidat) jiný prvek do instance této třídy.Obvykle nemá tento nástroj pro prvek nebo jiného obrazce přetažením nebo vložením.

    V příkladu DSL, vstup nebo výstup portu mohou být sloučeny do komponenty.Také součásti a komentáře lze sloučit do modelu.Složka

    Metody zpracování EGP třídy komponenty povolit komponentu přijmout porty, ale nejsou komentáře.Popisovač EGP root model třídy přijímá komentáře a komponenty však nejsou porty.

DomainModel.cs

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

PoznámkaPoznámka
Není stejné jako kořenová třída modelu.

Kopírování a odstranění víček definovat další prvky, které je třeba při zkopírování nebo odstranit prvek zahrnuta.Toto chování můžete řídit nastavením Šíří kopie a Šíří odstranit Vlastnosti rolí na každé straně každé relace.Pokud chcete hodnoty stanoví dynamicky, můžete zapsat kód přepsat metody třídy uzavření.Další informace získáte v tématu Jak: Program zkopírovat a vložit chování - přesměrování.

DomainModelResx.resx

Obsahuje řetězce například popisy domény třídy a vlastnosti, názvy vlastností, popisky panelu, standardní chybové zprávy a jiné řetězce, které mohou být zobrazeny pro uživatele.Obsahuje také nástroje ikony a obrázky pro tvary v obrázku.

Tento soubor je vázán do vestavěné sestavení a poskytuje výchozí hodnoty těchto prostředků.Vytvořením satelitní sestavení, která obsahuje lokalizovanou verzi zdroje je možné lokalizovat vaše DSL.Verze bude použit při instalaci DSL v kultuře odpovídající lokalizované prostředky.Další informace naleznete v tématu Zavedení řešení domény specifické pro jazyk.

DomainRelationships.cs

Každé propojení mezi dvěma prvky modelu je reprezentován instanci třídy vztah domény.Všechny třídy relace jsou odvozeny z lElementLink, která zase je odvozen od ModelElement.Protože ModelElement instance vztahu může mít vlastnosti a může být zdrojové nebo cílové relace.

HelpKeywordHelper.cs

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

MultiplicityValidation.cs

Do role vztahu, kde určíte násobnost 1..1 nebo 1.. *, varování se uživatel požaduje alespoň jednu instanci vztahu.Tento soubor obsahuje ověření omezení, které implementují těchto varování.Vkládání nadřazený odkaz 1..1 nebyla ověřena.

Pro tato omezení, které mají být provedeny, musí nastavení jednoho z používá... možnosti Editor\Validation uzel v aplikaci Explorer DSL.Další informace naleznete v tématu Ověření domény specifické pro jazyk.

PropertiesGrid.cs

Tento soubor obsahuje kód, pouze pokud jste připojili vlastní typ popisovače vlastnosti domény.Další informace naleznete v tématu Přizpůsobení okna Vlastnosti.

SerializationHelper.cs

  • Metoda ověření zajistit odkazuje stejné zástupný název žádné dva prvky.Další informace naleznete v tématu Přizpůsobení souboru úložiště a serializace XML.

  • Třída SerializationHelper, která poskytuje funkce, které běžně používá serializaci třídy.

Serializer.cs

Třída serializátor pro každé domény třídy, vztah, tvar, konektor, diagram a modelu.

Mnoho funkcí těchto tříd lze řídit pomocí nastavení v aplikaci Explorer DSL pod Chování serializace Xml.

Shapes.cs

Třída pro každý obrazec Třída v definici DSL.Obrazce jsou odvozeny z NodeShape.Další informace naleznete v tématu Přizpůsobení souboru úložiště a serializace XML.

Potlačit generované metody s vlastní metody částečné třídy nastavit Generuje dvojité odvozené konektoru v definici DSL.Chcete-li nahradit konstruktor vlastního kódu, nastavte Má vlastní konstruktor.

Barva a některé proměnné stylu funkce za běhu, pravým tlačítkem myši na třídu v diagramu definice DSL a přejděte na Přidat vystaveni.

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

ToolboxHelper.cs

Nastaví prvek skupiny prototypy instalací do prvku nástroje panelu.Kopie těchto prototypy sloučeny s prvky cíl při spuštění nástroje.

Nelze přepsat CreateElementPrototype() definujte položku sady nástrojů, které vytvoří skupinu několik objektů.Můžete například definovat položky představují objekty, které mají dílčí součásti.Po změně kódu resetování experimentální instance Visual Studio k vymazání mezipaměti na panelu nástrojů.

Vygenerované soubory v projektu DslPackage

DslPackage spáruje DSL model Visual Studio prostředí a správa příkazů okna, nástrojů a nabídky.Většina tříd jsou dvojité odvozeny, tak, aby jejich metod lze přepsat.

Název souboru

Description

CommandSet.cs

Příkazy místní nabídky, které jsou viditelné v diagramu.Můžete upravit nebo přidat do této sady.Tento soubor obsahuje kód pro příkazy.Umístění příkazů nabídek je určena v souboru Commands.vsct.Další informace naleznete v tématu Zápis uživatelské příkazy a akce.

Constants.cs

Identifikátory GUID.

DocData.cs

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

Například pokud chcete v databázi namísto souboru uložit vaše DSL, je nelze přepsat Load a Save metod.

DocView.cs

YourDslDocView spravuje okna, zobrazí se v diagramu.Můžete například vložit diagram uvnitř windows formuláře:

Přidáte uživatelský ovládací prvek Soubor projektu DslPackage.Přidáte Panel, ve kterém lze zobrazit v diagramu.Přidáte tlačítka a další ovládací prvky.V zobrazení kódu formuláře přidejte následující kód, nastavení názvů 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

Konkretizuje DocData a DocView.Plní standardní rozhraní, Visual Studio používá při spuštění balíčku DSL, otevřete editor.Se odkazuje ProvideEditorFactory atribut v Package.cs

GeneratedVSCT.vsct

Vyhledá standardní příkazy v nabídkách, jako například místní nabídka diagram Upravit nabídce atd.Kód pro příkazy je v CommandSet.cs.Můžete přemístit nebo změnit standardní příkazy a můžete přidat vlastní příkazy.Další informace naleznete v tématu Zápis uživatelské příkazy a akce.

ModelExplorer.cs

Definuje Průzkumníka modelů pro váš modem DSL.Toto je zobrazení stromu modelu, který se uživateli zobrazí vedle diagramu.

Například nelze přepsat InsertTreeView() změnit pořadí prvků v Průzkumníku modelů.

Pokud chcete výběr v Průzkumníku modelů udržovat 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 okno, ve kterém se zobrazí Průzkumník modelu.Výběr položek v aplikaci explorer zpracovává.

Package.cs

Tento soubor definuje, jak DSL integruje do Visual Studio.Atributy pro třídu balíček zaregistrovat modem DSL jako obslužnou rutinu pro soubory, které mají příponu souboru, aplikace, definovat jeho nástrojů a určit, jak otevřít nové okno.Metodu Initialize() se nazývá jednou při načtení první DSL do Visual Studio instance.

Source.Extension.vsixmanifest

Chcete-li upravit soubor upravit .tt souboru.

Poznámka k upozorněníUpozornění
Pokud upravujete soubor .tt zahrnout zdroje jako ikony nebo obrazy, přesvědčte se, zda prostředek je součástí v sestavení VSIX.V aplikaci Solution Explorer vyberte soubor a ujistěte se, že zahrnout do VSIX vlastnost je True.

Tento soubor Určuje, jak DSL je zabalen do aplikace Visual Studio integrace rozšíření (VSIX).Další informace naleznete v tématu Zavedení řešení domény specifické pro jazyk.

Viz také

Koncepty

Jak definovat domény specifické pro jazyk

Principy modelů, tříd a vztahy

Přizpůsobení a rozšíření domény specifické pro jazyk

Další zdroje

Zápis kódu nastavit domény specifické pro jazyk