Поделиться через


Общие сведения о коде доменных языков

Решение доменного языка (DSL) создает API, который можно использовать для чтения и обновления в экземпляры DSL Visual Studio.Этот API задается в коде, который создан из определений DSL.Этот раздел описывает API, сформированное.

Решение примера: схемы компонентов

Чтобы создать решение, источник большинства примеры в этом подразделе, создание из DSL Модели компонентов шаблон решения.Это один из стандартных шаблонов, который появляется при создании нового решения DSL.

ПримечаниеПримечание

Шаблон DSL схем компонентов не привязан к схемам компонентов UML, которые можно создать с помощью меню архитектура in Visual Studio Ultimate.в Создать проект разверните диалоговое окно Другие типы проектов \ расширяемость затем перейдите Конструкторе доменного языка.

Нажмите клавишу F5 и эксперимент, если вы не знакомы с этим шаблоном решения.Обратите внимание, что в частности созданные порты, перетащив средство порта на компонент и что можно подключиться порты.

Компоненты и взаимосвязанные порты

Структура решения DSL

Dsl проект определяет интерфейс API для DSL.DslPackage проект определяет, как она интегрируется с Visual Studio.Можно также добавлять собственные проекты, которые также могут содержать код, созданный из модели.

Bb286947.collapse_all(ru-ru,VS.110).gifКаталоги кода

Большая часть кода в каждом из этих проектов создается из Dsl\DslDefinition.dsl.Созданный код Generated Code папка.Чтобы просмотреть созданный файл, нажмите кнопку [+] рядом с создавать .tt файл.

Рекомендуется проверить созданный код, которые помогут понять DSL.Чтобы просмотреть созданные файлы, файлы *.tt в обозревателе решений.

Файлы *.tt содержащих очень маленький при создании кода.Вместо этого они используют <#include> правила для включения общие файлы шаблонов.Общие файлы находятся в пределах \Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates

При добавлении собственный программный код к решению DSL, добавьте его в отдельном файле, out создаваемой папки кода.Можно создать a Custom Code папка.(При добавлении новый файл кода в пользовательской папке, не забудьте освободить пространство имен в исходном скелете кода.)

Настоятельно не рекомендуется изменить созданный код непосредственно, поскольку собственные правки, будут утеряны при перестроении решения.Вместо этого настраивать свой DSL:

  • Обработка многих параметров в определении DSL.

  • Запишите разделяемые классы в отдельных файлах кода в методы переопределения, определенные в рамках или унаследовано, создаваемые классы.В некоторых случаях необходимо установить Создает производный тип double параметр класса в определении DSL, возможность переопределить создаваемый метод.

  • Установка параметров в определении DSL, которые вызывают созданный код предоставить "обработчик" для собственного кода.

    Например, если задать Имеет пользовательский конструктор параметр доменного класса, а затем создает решение, увидит сообщения об ошибке.При двойном щелчке одно из следующих сообщений об ошибке, вы увидите комментарии в созданном коде, в которых объясняется, что пользовательский код должен предоставить.

  • Написать собственные текстовые шаблоны для формирования кода, относящийся к приложению.Включить файлы можно использовать для совместного использования части, общие для многих шаблонов проектов и можно создать Visual Studio шаблоны проектов для настройки проектов, которые инициализированы с собственной структурой файла.

Создаваемые файлы в Dsl

Следующие созданные файлы отображаются в Dsl этот проект.

Имя файла

Описание

YourDslSchema.xsd

Схема для файлов, содержащая экземпляры DSL.Этот файл копируется в компиляции (binкаталог.)При установке собственного DSL, можно скопировать этот файл до \Program Files\Microsoft Visual Studio 11.0\Xml\Schemas таким образом, что файлы модели можно проверить.Дополнительные сведения см. в разделе Развертывание решений на доменных языках.

Если вы настраиваете сериализация с помощью параметров в обозревателе DSL, соответствующим образом изменяется схема.Однако если необходимо написать собственный код сериализации, то этот файл может не представлять фактическую схему.Дополнительные сведения см. в разделе Настройка хранилища файлов и XML-сериализации.

ConnectionBuilders.cs

Построитель подключения класс, который создает связи.Код за средством соединения.Этот файл содержит пару классов для каждого средства подключения.Их имена извлекаются из имен средства ссылки доменной и соединения: ОтношениеПостроитель. ConnectorToolConnectAction.

(В примере компонентов решений, построителей соединения вызвать ConnectionBuilder, совпадение, поскольку доменная связь называется Соединением.)

Связь создается в ОтношениеBuilder.Connect() метод.По умолчанию версия проверяется, что элементы источника и целевой модели являются допустимыми, а затем создает связь.Примеры.

CommentReferencesSubject(sourceAccepted, targetAccepted);

Каждый класс построителя создается из узла Построители соединения раздел в обозревателе DSL.Одно Connect метод может создать связи между одним или несколькими парами доменных классов.Каждая пара определена директивой соединения ссылки, можно найти в обозревателе DSL в узле построителя.

Например, можно добавить к предоставлению одного соединения ссылок построитель подключения для каждого из 3 типов связей в образце DSL.Это ожидания бы пользователь с единственным средством соединения.Тип отношения быть создан в зависимости от типов источников и целевых объектов элементы выбранного пользователем.Чтобы добавить ссылку подключите рекомендации щелкните правой кнопкой мыши в обозревателе DSL построитель.

Чтобы создавать пользовательский код, выполняемый при создании определенный тип ссылки доменной, выберите соответствующую директиву соединения ссылки в узле построителя.В окне свойства установите Пользовательский интерфейс использует подключение.Перестройте решение, а затем укажите код для устранения результирующей ошибки.

Чтобы написать пользовательский код, который выполняется, когда пользователь использует это средство соединения, установите Изготовлена custom свойство построителя соединения.Можно предоставить код, который определяет, разрешен ли элемент источника, разрешены ли определенные сочетания источник и целевой объект и обновляет должно быть сделано к модели, когда устанавливается соединение.Например, можно разрешить соединение, только если оно не создатьTfо бы цикл в схеме.Вместо отдельных связей, то связи удалось создать экземпляр более сложный шаблон несколько взаимосвязанных элементов между источником и целевым объектом.

Connectors.cs

Содержит классы для соединителей, элементы схемы, которые обычно представляют связи ссылки.Каждый класс создается из одного соединителя в определении DSL.Каждый класс является производным из соединителей BinaryLinkShape

Чтобы сделать цвет и некоторые другие переменную функций стиля во время выполнения, щелкните правой кнопкой мыши класс на схеме определения DSL и к Добавьте предоставляется.

Чтобы обеспечить дополнительную переменную функций стиля во время выполнения, см. в разделе например TextField и ShapeElement.

Diagram.cs

Содержит класс, указывающее схему.Он является производным от Diagram.

Чтобы сделать цвет и некоторые другие переменную функций стиля во время выполнения, щелкните правой кнопкой мыши класс на схеме определения DSL и к Добавьте предоставляется.

Кроме того, этот файл содержит FixupDiagram правило, которое отвечает, если новый элемент добавлен в модель.Правило добавить новую фигуру и ссылки фигуру к элементу модели.

DirectiveProcessor.cs

Этот процессор директив позволяет пользователям создавать текстовые шаблоны, которые считывают экземпляр DSL.Процессор директив загружает сборки (DLL) для DSL и эффективно вставляет using выписки для пространства имен.Это позволяет коду в текстовых шаблонах использования классов и связей, которое определено в вашем DSL.

Дополнительные сведения см. в разделах Создание кода из доменного языка и Создание пользовательских обработчиков директив для текстовых шаблонов T4.

DomainClasses.cs

Реализации доменных классов, которые вы определили, включая абстрактные классы, и класс модели.Они получаются из ModelElement.

Каждый доменный класс содержит:

  • Определение свойств и вложенным классом обработчика для каждого свойства домена.Можно переопределить OnValueChanging () и OnValueChanged ().Дополнительные сведения см. в разделе Обработчики изменений значений свойств доменов.

    в примере DSL, Comment класс содержит свойство Text и класс обработчика TextPropertyHandler.

  • Свойства метода доступа для связей, в которых участвует этот доменный класс.(Отсутствует вложенный класс для роли свойств.)

    в примере DSL, Comment класс содержит методы доступа, которые обращаются к его родителя с помощью модели внедрения связь ComponentModelHasComments.

  • Конструкторы.Если необходимо переопределить эти, параметр Имеет пользовательский конструктор на доменном классе.

  • Методы обработчика заполнителя группы элементов (EGP).Эти необходимы, если пользователь сможет Объединить (сложение) другой элемент в экземпляры этого класса.Обычно пользователь делает это путем перетаскивания из средств или других элементов формы или путем вставить.

    В примере DSL, порт или порт выввода ввода можно объединить в компонент.Кроме того, можно объединить компоненты и комментарии на модель.Метод

    Методы обработчика EGP в класс компонента позволяют компонент для использования портов, но не комментарии.Обработчик EGP в классе корневого элемента модели принимает комментарии и компоненты, но не порты.

DomainModel.cs

Класс, который представляет модель домена.Он является производным от DomainModel.

ПримечаниеПримечание
Это не то же, что и корневой класс модели.

Закрытие копии и delete определяет другие элементы должны быть включены при скопирован или удаляется элемент.Можно отслеживать эти расширения функциональности путем установки Передает копии и Распространяет удалить свойства ролей на каждой стороне каждого отношения.Если необходимо автоматическое определение значений динамически, то можно написать код для переопределения методов классов закрытия.Дополнительные сведения см. в разделе Практическое руководство. Программирование функций копирования и вставки — перенаправление.

DomainModelResx.resx

Содержит строки описания классов и свойств доменных имен свойств, меток области элементов стандартных сообщений об ошибках и других строк, которые могут отображаться пользователю.Он также содержит значки и образы средства для фигур образа.

Этот файл, привязанный встроенную в сборку и предоставляет значения по умолчанию для этих ресурсов.Можно локализовать его DSL, создав вспомогательная сборка, содержащая локализованную версию ресурсов.Эта версия будет использоваться при DSL устанавливается в языке и региональных параметрах соответствующий локализованных ресурсов.Дополнительные сведения см. в разделе Развертывание решений на доменных языках.

DomainRelationships.cs

Каждая связь между 2 элементами в модели ссылки доменной представленной экземпляром класса.Все классы наследуются от связей lElementLinkкоторого, в свою очередь, наследуется от ModelElement.Поскольку это ModelElement экземпляр связи может иметь свойства и может быть источником или целевым объектом связи.

HelpKeywordHelper.cs

Предоставляет функции, которые используются при нажатии пользователем клавиши F1.

MultiplicityValidation.cs

В ролях в связях, в котором указывается количество элементов 1..1 или 1. *, пользователь должен быть предупрежен которого хотя бы один экземпляр связи является обязательным.Этот файл предоставляет ограничения проверки, которые реализуют эти предупреждения.Не подтвержена 1..1 содержит ссылку на родительский объект.

Для этих ограничений для выполнения необходимо иметь одно Использует… параметры Редактор \ проверка узел в обозревателе DSL.Дополнительные сведения см. в разделе Проверка в доменных языках.

PropertiesGrid.cs

Этот файл содержит код, только если вложили настраиваемый дескриптор типа к свойству домена.Дополнительные сведения см. в разделе Настройка окна свойств.

SerializationHelper.cs

  • Метод проверки, чтобы убедиться, что 2 элемента не ссылается тем же моникером.Дополнительные сведения см. в разделе Настройка хранилища файлов и XML-сериализации.

  • Класс SerializationHelper, который предоставляет функции, которые используются в стандартном классами сериализации.

Serializer.cs

Класс сериализатора для каждого доменного класса, связи, фигуры соединителя, схемы и модели.

Многие из функций этих классов можно наблюдать параметрами в обозревателе DSL вниз Реакция на событие сериализации XML.

Shapes.cs

Класс для каждого класса фигуры в определении DSL.Фигуры производными от NodeShape.Дополнительные сведения см. в разделе Настройка хранилища файлов и XML-сериализации.

Для переопределения созданные методы с собственными методами в разделяемом классе, установите Создает производный тип double для соединителя в определении DSL.Чтобы заменить конструктор собственным кодом, установите Имеет пользовательский конструктор.

Чтобы сделать цвет и некоторые другие переменную функций стиля во время выполнения, щелкните правой кнопкой мыши класс на схеме определения DSL и к Добавьте предоставляется.

Чтобы обеспечить дополнительную переменную функций стиля во время выполнения, см. в разделе например TextField и ShapeElement

ToolboxHelper.cs

Настройка область элементов, установив заполнители группы элементов в инструменты для элемента.Копии этих заполнителей объединяются с элементами целевого объекта, когда пользователь запускает средство.

Можно переопределить CreateElementPrototype() определения элемента панели инструментов, создающий группа в составе несколько объектов.Например, можно определить элемент для представления объекты, имеющие sub-компоненты.После изменения кода, сбросить экспериментальном экземпляр Visual Studio очистка кэша области элементов.

Создаваемые файлы в проекте DslPackage

DslPackage подключить к модели DSL Visual Studio оболочка, управление окна область элементов, и команды меню.Большинство классов производный тип double, так что можно переопределить любой из этих методов.

Имя файла

Описание

CommandSet.cs

Команды контекстного меню, которые видны на схеме.Можно приспособиться или добавить в этот набор.Этот файл содержит код для команд.Расположение команд в меню файл Commands.vsct указано.Дополнительные сведения см. в разделе Написание пользовательских команд и действий.

Constants.cs

Идентификатор GUID.

DocData.cs

YourDslDocData управляет загрузка и сохранение модель в файл и создает экземпляр хранилища.

Например, если требуется сохранить DSL в базе данных, а не файла, то можно переопределить Load и Save методы.

DocView.cs

YourDslDocView управляет окно, в котором схема.Например, можно встроить схемы в формы windows forms:

Добавьте контрольный файл пользовательского элемента управления в проект DslPackage.Добавление панели, в которой схему можно отобразить.Добавьте кнопки и другие элементы управления.В представлении кода формы добавьте следующий код для обработки имена: 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

Создает экземпляр DocData и DocView.Она выполняет это стандартный интерфейс Visual Studio используется, чтобы открыть редактор когда запуске пакета DSL.Он ссылается на ProvideEditorFactory атрибут в Package.cs

GeneratedVSCT.vsct

Находит стандартные команды меню в меню, например, контекстное меню диаграммы изменить меню и т дКод для команд в CommandSet.cs.Можно переместить или изменять стандартные команды, и можно добавить собственные команды.Дополнительные сведения см. в разделе Написание пользовательских команд и действий.

ModelExplorer.cs

Задает обозреватель для модели DSL.Это представление в виде дерева модели, которые пользователь видит вместе с схемой.

Например, можно переопределить InsertTreeView() чтобы изменить порядок, в котором элементы отображаются в обозревателе моделей.

Если требуется выделение в обозревателе модели хранения синхронизирована с фрагментом схемы, можно использовать следующий код:

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

Определяет окно, в котором отображается в обозревателе моделей.Обрабатывает выделение элементов в обозревателе.

Package.cs

Этот файл определяет, как интегрировать в DSL Visual Studio.Атрибуты в класс пакета регистрируют DSL, как обработчик для файлов, имеющих расширение файла, определяющие свою область элементов и определяют, как открыть новое окно.Метод initialize () вызывается один раз при первом DSL будет загружен в выражении Visual Studio экземпляр.

Source.extension.vsixmanifest

Настраивать этот файл, правка .tt файл.

Предупреждающее замечаниеВнимание
Если редактируется tt-файл, чтобы включить ресурсы, например значки или изображений, убедитесь, что ресурс включен в построение VSIX.В обозревателе решений выберите файл и убедитесь, что Включить в Vsix свойство True.

Управления этого файла в виде DSL упакован в расширение интеграции Visual Studio (VSIX).Дополнительные сведения см. в разделе Развертывание решений на доменных языках.

См. также

Основные понятия

Определение доменного языка

Сведения о моделях, классах и отношениях

Настройка и расширение доменного языка

Другие ресурсы

Написание кода для настройки доменного языка