Udostępnij za pośrednictwem


Znajomość kodu DSL

Rozwiązanie języka specyficznego dla domeny (DSL) generuje interfejs API, który służy do odczytywania i aktualizowania wystąpienia DSL w Visual Studio.Ten interfejs API jest zdefiniowana w kodzie, który jest generowany w definicji DSL.W tym temacie opisano wygenerowanego interfejsu API.

To rozwiązanie przykład: diagramy składników

Aby utworzyć rozwiązanie, które jest źródłem większość przykłady w tym temacie, należy utworzyć DSL z modeli składnika rozwiązanie szablonu.Jest to standardowe szablony, które pojawia się podczas tworzenia nowego rozwiązania DSL.

[!UWAGA]

Szablon DSL diagramy składników nie jest powiązany z diagramy UML składników, które można tworzyć za pomocą menu architektury w Visual Studio Ultimate.W nowy projekt okna dialogowego rozwiń inne Types\Extensibility projektu , a następnie kliknij przycisk Designer języka specyficznego dla domeny.

Naciśnij klawisz F5 i doświadczeniu, jeśli nie są znane z tym szablonem rozwiązania.Zwróć uwagę na to w szczególności tworzonych przez Ciebie porty przeciągając narzędzie portu na składnik i czy można połączyć portów.

Składniki i portów połączonych

Struktura rozwiązania DSL

Dsl Projektu definiuje interfejs API dla swojego DSL.DslPackage Projektu definiuje sposób integruje się z Visual Studio.Można także dodać własne projektów, który może również zawierać kod generowany z modelu.

Katalogi w kodzie

Większość kodu w każdej z tych projektów jest generowana z Dsl\DslDefinition.dsl.Wygenerowany kod znajduje się w Generated Code folder.Aby wyświetlić wygenerowany plik, kliknij przycisk [+] obok Generowanie .tt pliku.

Zaleca się, aby sprawdzić wygenerowany kod, aby lepiej zrozumieć DSL.Aby wyświetlić wygenerowane pliki, rozwiń *.tt pliki w Eksploratorze rozwiązań.

Pliki *.tt zawierają bardzo mało generowania kodu.Zamiast tego należy użyć <#include> dyrektywy, aby dołączyć pliki szablonu współużytkowanego.Udostępnione pliki znajdują się w**\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates**

Po dodaniu własnego kodu do rozwiązania DSL, należy je umieścić w oddzielnym pliku, poza folderem wygenerowany kod.Należy utworzyć Custom Code folder.(Podczas dodawania nowego pliku kodu do folderu niestandardowych, pamiętaj, aby poprawić przestrzeń nazw w szkielet kodu początkowego.)

Zdecydowanie zaleca się że nie zmienisz wygenerowany kod bezpośrednio, ponieważ wprowadzone zmiany zostaną utracone podczas odbudowy rozwiązanie.Zamiast tego aby dostosować swoje DSL:

  • Należy dostosować wiele parametrów w definicji DSL.

  • Zapisuje częściowe klasy w plikach kodu oddzielne zastąpienie metody, które nie są zdefiniowane w lub dziedziczone przez wygenerowanego klasy.W niektórych przypadkach trzeba ustawić generuje podwójne opracowane opcji klasy w definicji DSL, aby możliwe było wygenerowanego metoda musi zostać zastąpiona.

  • Określ opcje w definicji DSL, które powodują wygenerowany kod w celu zapewnienia "punkty zaczepienia" swój kod.

    Na przykład jeśli ustawisz ma konstruktora niestandardowe opcji klasy domeny, a następnie tworzyć rozwiązania, zostanie wyświetlone komunikaty o błędach.Po dwukrotnym kliknięciu jednej z tych komunikatów o błędach, zobaczysz komentarze w wygenerowanego kodu, które wyjaśniają, co powinien zapewniać kodu niestandardowego.

  • Pisanie własnych szablonów tekstu do generowania kodu specyficzne dla danej aplikacji.Możesz Użyj dołączyć pliki do udostępnienia części szablonów, które są wspólne dla wielu projektów i tworzenia Visual Studio następujące szablony projektów, które są inicjowane z strukturę pliku projektu.

Wygenerowane pliki w Dsl

Następujące pliki wygenerowane są widoczne w Dsl projektu.

Nazwa pliku

Opis

YourDslSchema.xsd

Schemat dla plików, który zawiera wystąpienia swoje DSL.Ten plik zostanie skopiowany do kompilacji (bin) katalogu.Po zainstalowaniu sieci DSL, możesz skopiować ten plik do \Program Files\Microsoft Visual Studio 11.0\Xml\Schemas tak, aby można zweryfikować pliki modelu.Aby uzyskać więcej informacji, zobacz Wdrażanie rozwiązań dla języka specyficznego dla domeny.

W przypadku dostosowania serializacji, ustawiając opcje w Eksploratorze DSL, schemat zostanie zmieniona.Jednak jeśli piszesz kod serializacji, ten plik nie jest już może reprezentować rzeczywiste schematu.Aby uzyskać więcej informacji, zobacz Dostosowywanie przechowywania plików i serializacji XML.

ConnectionBuilders.cs

Konstruktor połączeń jest klasa, która umożliwia tworzenie relacji.Jest kod związany z narzędziem połączenia.Ten plik zawiera pary klasy dla każdego narzędzia połączenia.Ich nazwy są obliczane na podstawie nazwy domeny narzędzia relacji i połączenia: relacjikonstruktora, i ConnectorToolConnectAction.

(W przykładzie składnik rozwiązania jednego z konstruktorów połączenia jest wywoływana ConnectionBuilder, jest to zbieżność, ponieważ relacji domeny nosi nazwę połączenia).

Relacja jest tworzony w relacjiBuilder.Connect() metody.Wersja domyślna sprawdza, czy elementy modelu źródłowej i docelowej są akceptowane i następnie tworzy relację.Na przykład:

CommentReferencesSubject(sourceAccepted, targetAccepted);

Generowany jest węzłem w każdej klasy konstruktora konstruktorów połączenia sekcji w Eksploratorze DSL.Co Connect metody można tworzyć relacje między co najmniej jeden pary klas domeny.Każda para jest zdefiniowany dyrektywą łącze połączenia, który można znaleźć w Eksploratorze DSL węźle konstruktora.

Można na przykład dodać do jednego połączenia konstruktora dyrektywy połączyć łącze, dla każdego z trzech typów relacji w próbce DSL.Zapewni użytkownika za pomocą narzędzia jednego połączenia.Typ relacji wystąpienia zależą od typów źródłowa i docelowa elementy wybrane przez użytkownika.Aby dodać dyrektywy połączyć łącze, kliknij prawym przyciskiem myszy konstruktora w Eksploratorze DSL.

Można zapisać kodu niestandardowego, które jest uruchamiane po utworzeniu określonego typu relacji domeny, wybierz odpowiedni dyrektywa połączyć łącze w węźle konstruktora.W oknie dialogowym właściwości ustaw niestandardowe korzysta z połączenia.Ponownie utworzyć rozwiązanie, a następnie podaj kod w celu poprawiania błędów w wynikowe.

Pisanie kodu niestandardowego, zawsze wtedy, gdy użytkownik korzysta z tego narzędzia połączenia, należy ustawić jest niestandardowe właściwości konstruktora połączenia.Można podać kod, który decyduje, czy element źródła jest dozwolone, czy określona kombinacja źródła docelowy jest dozwolone i aktualizuje co należy wprowadzać do modelu po nawiązaniu połączenia.Na przykład można umożliwić połączenie tylko wtedy, gdy nie może utworzyć pętlę w schemacie.Zamiast relacji jeden łącze można utworzyć wystąpienia wzorca bardziej złożonych z kilku elementów pokrewnych odstępów między między źródłowym i docelowym.

Connectors.CS

Zawiera klasy dla łączników, które są elementów diagramu, które zazwyczaj reprezentują relacji odwołania.Każdej klasy jest generowany z jednego łącznika w definicji DSL.Każdej klasy łącznik jest tworzony na podstawieBinaryLinkShape

Aby kolor i niektóre inne zmienna funkcje stylu w czasie wykonywania, kliknij prawym przyciskiem myszy klasy w schemacie definicji DSL, a następnie wskaż polecenie Dodaj uwidaczniane.

Aby styl dodatkowe funkcje zmienną w czasie wykonywania, na przykład zobacz TextField i ShapeElement.

Diagram.CS

Zawiera klasę, która definiuje diagramu.Jest pochodną Diagram.

Aby kolor i niektóre inne zmienna funkcje stylu w czasie wykonywania, kliknij prawym przyciskiem myszy klasy w schemacie definicji DSL, a następnie wskaż polecenie Dodaj uwidaczniane.

Ponadto, ten plik zawiera FixupDiagram reguły, która odpowiada w przypadku dodania nowego elementu do modelu.Reguła dodaje nowy kształt i połączenie z elementem modelu kształtu.

DirectiveProcessor.cs

Ten procesor dyrektywy pomaga użytkowników, aby zapisać szablonów tekstu, które wystąpienie swoje DSL do odczytu.Procesor dyrektywy ładuje zestawy (dll) dla swojego DSL i efektywnie wstawia using instrukcje dla obszaru nazw.Dzięki temu kod w szablonach tekst do użycia klasy i relacje, które zdefiniowano w swojej DSL.

Aby uzyskać więcej informacji, zobacz Generowanie kodu z języka specyficznego dla domeny i Tworzenie niestandardowych procesorów dyrektywy T4 dotyczącej szablonu tekstowego.

DomainClasses.cs

Implementacje klasy domeny, które zostały zdefiniowane, łącznie z klasy abstrakcyjnej i klasy głównego modelu.Pochodzących z ModelElement.

Zawiera każdej klasy domeny:

  • Definicja właściwości i klasę zagnieżdżonej programu obsługi dla każdej właściwości domeny.Można zastąpić OnValueChanging() i OnValueChanged().Aby uzyskać więcej informacji, zobacz Obsługa zmian wartości właściwości domeny.

    W przykładzie DSL Comment klasa zawiera właściwość Text i klasę programu obsługi TextPropertyHandler.

  • Metoda dostępu właściwości relacji, w których uczestniczy tej klasy domeny.(Nie jest Brak zagnieżdżonej klasy dla właściwości roli).

    W przykładzie DSL Comment klasa zawiera metody dostępu, które uzyskują dostęp do swojego modelu nadrzędnego za pośrednictwem osadzenia relacji ComponentModelHasComments.

  • Konstruktorów.Jeśli chcesz zastąpić te ustawienia ma konstruktora niestandardowe klasy domeny.

  • Element metody obsługi prototypu grupy (EGP).Są to konieczne, jeśli użytkownik może scalania (Dodaj) innego elementu na wystąpienia tej klasy.Zazwyczaj użytkownik nie to przeciągając z narzędziem elementu lub innego kształtu lub przez wklejenie.

    W przykładzie DSL, dane wejściowe portu lub dane wyjściowe można scalić na składnika.Ponadto składniki i komentarze mogą być scalane na modelu.Program

    Metody obsługi EGP w tej klasie składnika umożliwiają składnik, aby zaakceptować portów, ale nie komentarzy.Program obsługi EGP w tej klasie modelu głównego akceptuje komentarze i składniki, ale nie portów.

DomainModel.cs

Klasa, która reprezentuje modelu domeny.Jest pochodną DomainModel.

[!UWAGA]

To nie jest taka sama jak klasa głównego modelu.

Kopiuj i Usuń zamknięcia zdefiniować, co inne elementy powinny być uwzględnione po skopiowaniu lub usunąć element.To zachowanie można kontrolować, ustawiając propaguje kopii i propaguje usunąć właściwości ról z każdej strony co relacji.Jeśli chcesz, aby wartości, które mają być określane dynamicznie, można wpisać kod do zastąpienia metod klas zamknięcia.Aby uzyskać więcej informacji, zobacz Porady: zachowanie dotyczące programowego kopiowania i wklejania — przekierowanie.

DomainModelResx.resx

Zawiera ciągi, takich jak nazwy domeny klasy i właściwości, nazwy właściwości, etykiet przybornika, standardowy komunikatów o błędach i innych ciągów, które mogą być wyświetlane dla użytkownika.Zawiera również ikony narzędzia i obrazów, obraz kształtów.

Ten plik jest powiązany w zestawie wbudowanych i udostępnia wartości domyślne tych zasobów.Twoje DSL można lokalizowanie tworząc w zestawie satelickie zawierający zlokalizowane wersje stworzonych przez zasoby.Ta wersja będą używane podczas DSL jest zainstalowany w kultury dopasowywania zlokalizowanych zasobów.Aby uzyskać więcej informacji, zobacz Wdrażanie rozwiązań dla języka specyficznego dla domeny.

DomainRelationships.cs

Każde łącze między dwoma elementami modelu jest reprezentowany przez wystąpienie klasy relacji domeny.Wszystkie klasy relacji pochodzących z ElementLink, który z kolei jest tworzony na podstawie ModelElement.Ponieważ jest ona zarządzanie magazynem, wystąpienia relacji może mieć właściwości i mogą być źródłowa lub docelowa relacji.

HelpKeywordHelper.cs

Udostępnia funkcje, które są używane, kiedy użytkownik naciśnie klawisz F1.

MultiplicityValidation.cs

W relacji ról, którego należy określić liczebność 1..1 lub 1.. *, użytkownik zostanie ostrzeżony tego co najmniej jedno wystąpienie relacji jest wymagany.Ten plik zawiera ograniczenia weryfikacji, które implementuje te ostrzeżenia.Łącze 1..1 do osadzenia nadrzędnego nie została zweryfikowana.

Do wykonania tych ograniczeń, musi być zainstalowany jeden z używa... Application Virtualization w Editor\Validation węzła w Eksploratorze DSL.Aby uzyskać więcej informacji, zobacz Sprawdzanie poprawności w języku specyficznym dla domeny.

PropertiesGrid.cs

Ten plik zawiera kod tylko wtedy, gdy dołączono deskryptora typu niestandardowego we właściwości domeny.Aby uzyskać więcej informacji, zobacz Dostosowywanie okna właściwości.

SerializationHelper.cs

  • Metodę weryfikacji, aby upewnić się, że nie dwa elementy są określone przez tej samej moniker.Aby uzyskać więcej informacji, zobacz Dostosowywanie przechowywania plików i serializacji XML.

  • Klasa SerializationHelper udostępnia funkcje, które są używane w typowych klasy serializacji.

Serializer.CS

Serializator klasę dla każdej klasy domeny, relacji, kształtu, łącznik, diagramu i modelu.

Wiele funkcji tych klas kontrolowana przez ustawienia w Eksploratorze DSL pod zachowanie serializacji Xml.

Shapes.CS

Klasa dla każdej klasy kształt w definicji DSL.Kształty są obliczane na podstawie NodeShape.Aby uzyskać więcej informacji, zobacz Dostosowywanie przechowywania plików i serializacji XML.

Aby zastąpić metody wygenerowane za pomocą własnych metod w klasie częściowe, należy ustawić generuje opracowane podwójnym łącznika w definicji DSL.Aby zastąpić konstruktora swój kod, należy ustawić ma konstruktora niestandardowe.

Aby kolor i niektóre inne zmienna funkcje stylu w czasie wykonywania, kliknij prawym przyciskiem myszy klasy w schemacie definicji DSL, a następnie wskaż polecenie Dodaj uwidaczniane.

Aby styl dodatkowe funkcje zmienną w czasie wykonywania, na przykład zobacz TextField iShapeElement

ToolboxHelper.cs

Konfiguruje przybornika poprzez zainstalowanie prototypów grupy elementu do narzędzia elementu.Kopie tych prototypów są scalane z elementów docelowych, jeśli użytkownik narzędzia.

Można zastąpić CreateElementPrototype() do definiowania element przybornika, który tworzy grupę kilka obiektów.Na przykład można zdefiniować elementu do reprezentowania obiektów, które mają składniki podrzędne.Po zmianie kodu, resetowanie doświadczalnych wystąpienie Visual Studio wyczyszczenia pamięci podręcznej przybornika.

Wygenerowane pliki w projekcie DslPackage

DSL model couples DslPackage Visual Studio powłoki poleceń okna, przybornika i menu zarządzania.Większość klas są podwójne opracowane, co można przesłonić ich metod.

Nazwa pliku

Opis

CommandSet.cs

Poleceń menu kontekstowego, które są widoczne na diagramie.Można dostosować lub dodać do tego zestawu.Ten plik zawiera kod dla polecenia.Lokalizacja poleceń w menu jest określana przez plik Commands.vsct.Aby uzyskać więcej informacji, zobacz Pisanie poleceń i akcji użytkownika.

Constants.CS

Identyfikatory GUID.

DocData.cs

YourDslDocData zarządza ładowania i zapisywania do pliku modelu, a następnie utworzy wystąpienie magazynu.

Na przykład, jeśli chcesz zapisać swoje DSL w bazie danych, a nie w pliku, można zastąpić Load i Save metody.

DocView.cs

YourDslDocView zarządza okna pojawia się diagramu.Na przykład można osadzić diagramu w formie systemu windows:

Dodaj plik kontrolki użytkownika do projektu DslPackage.Dodaj Panel, w którym można wyświetlić diagramu.Dodaj przycisków i innych kontrolek.W widoku Kod formularza Dodaj następujący kod, dostosowywanie nazwy użytkownika 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

Tworzy DocData i DocView.Działa zgodnie standardowego interfejs, który Visual Studio używa, aby otworzyć Edytor podczas uruchamiania pakietu DSL.Odwołuje się do niego ProvideEditorFactory atrybutu w parametrze Package.cs

GeneratedVSCT.vsct

Lokalizuje standardowych poleceń menu, takich jak menu kontekstowego diagramu edytować menu itd.Kod dla polecenia jest CommandSet.cs.Można przenieść lub zmodyfikować te polecenia, standard i może dodać własne polecenia.Aby uzyskać więcej informacji, zobacz Pisanie poleceń i akcji użytkownika.

ModelExplorer.cs

Definiuje Eksploratora modelu dla swojego DSL.To jest widoczny dla użytkownika obok diagramu modelu w widoku drzewa.

Na przykład można zastąpić InsertTreeView() Aby zmienić kolejność wyświetlania elementów w Eksploratorze modelu.

Wybór w Eksploratorze modelu, aby zachować synchronizację z wyborem diagramu, można użyć poniższego kodu:

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

Definiuje okna, w którym jest wyświetlany w Eksploratorze modelu.Obsługuje wybór elementów w Eksploratorze.

Package.CS

Ten plik definiuje sposób DSL integruje się z Visual Studio.Atrybuty klasy pakietu zarejestrować DSL jako programu obsługi plików, które mają swoje rozszerzenie pliku, zdefiniuj jego przybornika i umożliwia definiowanie sposobu Otwórz nowe okno.Metoda Initialize() jest wywoływana jeden raz, jeśli pierwszy DSL jest ładowane do Visual Studio wystąpienie.

Source.Extension.vsixmanifest

Aby dostosować ten plik, edytować .tt pliku.

Informacje dotyczące przestrogiPrzestroga

Jeśli zostanie zmodyfikowany plik .tt, aby uwzględnić zasoby, takie jak ikony lub obrazów, upewnij się, czy zasób jest uwzględniane w kompilacji VSIX.W Eksploratorze rozwiązań, zaznacz go i upewnij się, że uwzględnianie w VSIX właściwość jest True.

Ten plik Określa, jak DSL jest dostarczana do programu Visual Studio integracji rozszerzenia (VSIX).Aby uzyskać więcej informacji, zobacz Wdrażanie rozwiązań dla języka specyficznego dla domeny.

Zobacz też

Koncepcje

Porady: definiowanie języka właściwego dla domeny

Opis modeli, klas i relacji

Dostosowywanie i rozszerzanie języka specyficznego dla domeny

Inne zasoby

Pisanie kodu pod kątem dostosowywania języka specyficznego dla domeny