Начало работы с предметно-ориентированными языками
В этом разделе описываются основные понятия, связанные с определением и использованием языка для конкретного домена (DSL), созданного с помощью пакета SDK для моделирования для Visual Studio.
Примечание.
Пакет SDK преобразования текстовых шаблонов и пакет SDK для моделирования Visual Studio устанавливаются автоматически при установке определенных компонентов Visual Studio. Дополнительные сведения см . в этой записи блога.
Если вы не знакомы с DSLs, рекомендуется работать с лабораторией средств DSL, которую можно найти на этом сайте: пакет SDK для визуализации и моделирования
Что можно сделать с языком для конкретного домена?
Язык для конкретного домена — это нотация, обычно графическая, предназначенная для конкретной цели. В отличие от этого, такие языки, как UML, являются общими. В DSL можно определить типы элементов модели и их связи, а также способ их представления на экране.
При разработке DSL его можно распространить как часть пакета расширения интеграции Visual Studio (VSIX). Пользователи работают с DSL в Visual Studio:
Нотация является только частью DSL. Вместе с нотацией пакет VSIX включает средства, которые пользователи могут применять, чтобы помочь им редактировать и создавать материалы из своих моделей.
Одним из основных приложений DSLs является создание кода программы, файлов конфигурации и других артефактов. Особенно в крупных проектах и линиях продуктов, где будет создано несколько вариантов продукта, создание многих переменных аспектов из DSLs может обеспечить большое увеличение надежности и очень быстрое реагирование на изменения требований.
Остальная часть этого обзора — это пошаговое руководство по созданию и использованию языка для конкретного домена в Visual Studio.
Необходимые компоненты
Для определения доменного языка необходимо установить следующие компоненты.
Компонент | Ссылка |
---|---|
Visual Studio | http://go.microsoft.com/fwlink/?LinkId=185579 |
SDK для Visual Studio | https://go.microsoft.com/fwlink/?linkid=2166172 |
Пакет SDK для моделирования для Visual Studio |
Примечание.
Компонент Text Template Transformation (Преобразование текстовых шаблонов) автоматически устанавливается как часть рабочей нагрузки разработки расширений Visual Studio. Его также можно установить на вкладке Отдельные компоненты Visual Studio Installer в категории Пакеты SDK, библиотеки и платформы. Установите компонент Пакет SDK для моделирования со вкладки Отдельные компоненты.
Создание решения DSL
Чтобы создать новый язык для конкретного домена, создайте новое решение Visual Studio с помощью шаблона проекта языка для конкретного домена.
В меню Файл выберите пункт Создать и затем пункт Проект.
В разделе "Типы проектов" разверните узел "Другие типы проектов" и щелкните "Расширяемость".
Щелкните конструктор языков для конкретного домена.
В поле "Имя" введите FamilyTree. Щелкните OK.
Откроется мастер языка для конкретного домена и отображает список решений DSL шаблона.
Щелкните каждый шаблон, чтобы просмотреть описание,
Шаблоны полезны для начала. Каждый из них предоставляет полный рабочий DSL, который можно изменить в соответствии с вашими потребностями. Обычно вы выберете шаблон, ближайший к которому вы хотите создать.
В этом пошаговом руководстве выберите шаблон "Минимальный язык ".
Введите расширение имени файла для DSL на соответствующей странице мастера. Это расширение будут использовать файлы, содержащие экземпляры DSL.
Выберите расширение, которое не связано с любым приложением на компьютере или на любом компьютере, где требуется установить DSL. Например, docx и htm будут неприемлемыми расширениями имен файлов.
Мастер предупредит, если расширение уже используется в качестве DSL. В этом случае выберите другое расширение имени файла. Можно также сбросить экземпляр экспериментального пакета SDK для Visual Studio, чтобы удалить старые экспериментальные конструкторы. В меню "Пуск Windows" введите visual Studio, а затем выполните команду "Сброс экспериментального экземпляра Microsoft Visual Studio", соответствующую вашей версии Visual Studio.
Проверьте другие страницы и нажмите кнопку "Готово".
Создается решение, содержащее два проекта. Они называются Dsl и DslPackage. Откроется файл схемы с именем DslDefinition.dsl.
Примечание.
Большая часть кода, который можно увидеть в папках в двух проектах, создается из DslDefinition.dsl. По этой причине большинство изменений в DSL вносятся в этот файл.
После этого пользовательский интерфейс примет следующий вид:
Данное решение определяет доменный язык. Дополнительные сведения см. в разделе "Общие сведения о пользовательском интерфейсе средств языка для конкретного домена".
Важные части решения DSL
Обратите внимание на следующие аспекты нового решения:
Dsl\DslDefinition.dsl Это файл, который отображается при создании решения DSL. Почти весь код в решении создается из этого файла, и большинство изменений, внесенных в определение DSL, вносятся здесь. Дополнительные сведения см. в статье "Работа с схемой определения DSL".
Проект Dsl Этот проект содержит код, определяющий язык, зависящий от домена.
Проект DslPackage Этот проект содержит код, позволяющий открывать и изменять экземпляры DSL в Visual Studio.
Запуск DSL
Вы можете запустить решение DSL сразу после его создания. Позже вы можете постепенно изменить определение DSL, выполнив решение снова после каждого изменения.
Экспериментирование с DSL
Щелкните "Преобразовать все шаблоны" на панели инструментов Обозреватель решений. Это повторно создает большую часть исходного кода из DslDefinition.dsl.
Примечание.
При изменении dslDefinition.dsl необходимо нажать кнопку "Преобразовать все шаблоны ", прежде чем перестроить решение. Этот шаг можно автоматизировать. Дополнительные сведения см. в разделе "Автоматизация преобразования всех шаблонов".
Нажмите клавишу F5или выберите в меню Отладка пункт Начать отладку.
DsL сборки и устанавливается в экспериментальном экземпляре Visual Studio.
Запускается экспериментальный экземпляр Visual Studio. Экспериментальный экземпляр принимает свои параметры из отдельного поддерева реестра, где расширения Visual Studio регистрируются в целях отладки. Обычные экземпляры Visual Studio не имеют доступа к расширениям, зарегистрированным там.
В экспериментальном экземпляре Visual Studio откройте файл модели с именем Test из Обозреватель решений.
- или -
Щелкните правой кнопкой мыши проект отладки, выберите пункт "Добавить" и выберите пункт "Элемент". В диалоговом окне "Добавление элемента" выберите тип файла DSL.
Файл модели открывается как пустая схема.
Откроется панель элементов и отображаются средства, соответствующие типу схемы.
Используйте средства для создания фигур и соединителей на схеме.
Чтобы создать фигуры, перетащите из средства "Пример фигуры" на схему.
Чтобы подключить две фигуры, щелкните инструмент "Пример соединителя", щелкните первую фигуру и щелкните вторую фигуру.
Щелкните метки фигур, чтобы изменить их.
Экспериментальный Visual Studio будет выглядеть следующим образом:
Содержимое модели
Содержимое файла, который является экземпляром DSL, называется моделью. Модель содержит элементы модели и связи между элементами. Определение DSL указывает, какие типы элементов модели и ссылки могут существовать в модели. Например, в DSL, созданном из шаблона "Минимальный язык", существует один тип элемента модели и один тип ссылки.
Определение DSL может указать, как модель отображается на схеме. Вы можете выбрать различные стили фигур и соединителей. Можно указать, что некоторые фигуры отображаются внутри других фигур.
Модель можно просмотреть как дерево в представлении обозревателя при редактировании модели. При добавлении фигур на схему элементы модели также отображаются в обозревателе. Обозреватель можно использовать, даже если диаграмма отсутствует.
Если обозреватель не отображается в экземпляре отладки Visual Studio, в меню "Вид" выберите пункт "Другие окна" и выберите< "Обозреватель языков>".
The API of your DSL
DSL создает API, позволяющий считывать и обновлять модели, которые являются экземплярами DSL. Одним из приложений API является создание текстовых файлов из модели. Дополнительные сведения см. в статье Создание кода во время разработки с помощью текстовых шаблонов T4.
В решении отладки откройте файлы шаблонов с расширением .tt. В этих примерах показано, как создать текст из моделей и проверить API DSL. Один из примеров написан в Visual Basic, а другой — в Visual C#.
В каждом файле шаблона создается файл. Разверните файл шаблона в Обозреватель решений и откройте созданный файл.
Файл шаблона содержит короткий сегмент кода, который перечисляет все элементы в модели.
Созданный файл содержит результат.
При изменении файла модели вы увидите соответствующие изменения в созданных файлах после повторного создания файлов.
Повторное создание текстовых файлов после изменения файла модели
В экспериментальном экземпляре Visual Studio сохраните файл модели.
Убедитесь, что параметр имени файла в каждом файле TT ссылается на файл модели, который используется для экспериментов. Сохраните TT-файл.
Щелкните "Преобразовать все шаблоны" на панели инструментов Обозреватель решений.
- или -
Щелкните правой кнопкой мыши шаблоны, которые требуется повторно создать, и нажмите кнопку "Запустить настраиваемое средство".
В проект можно добавить любое количество файлов текстовых шаблонов. Каждый шаблон создает один файл результата.
Примечание.
При изменении определения DSL пример кода текстового шаблона не будет работать, если вы не обновите его.
Дополнительные сведения см. в разделе "Создание кода на основе конкретного домена " и написание кода для настройки языка для конкретного домена.
Настройка DSL
Если вы хотите изменить определение DSL, закройте экспериментальный экземпляр и обновите определение в основном экземпляре Visual Studio.
Примечание.
После изменения определения DSL можно потерять сведения в тестовых моделях, созданных с помощью более ранних версий. Например, решение отладки содержит файл с именем Sample, который содержит некоторые фигуры и соединители. После начала разработки определения DSL они не будут видимыми, и они будут потеряны при сохранении файла.
Вы можете сделать широкий спектр расширений в DSL. В следующих примерах вы получите представление о возможностях.
После каждого изменения сохраните определение DSL, нажмите кнопку "Преобразовать все шаблоны" в Обозреватель решений, а затем нажмите клавишу F5, чтобы поэкспериментировать с измененным DSL.
Переименование типов и инструментов
Переименуйте существующие классы домена и связи. Например, начиная с определения Dsl, созданного на основе шаблона "Минимальный язык", можно выполнить следующие операции переименования, чтобы dsL представляло деревья семьи.
Переименование классов домена, связей и средств
На схеме DslDefinition переименуйте ExampleModel в FamilyTreeModel, ExampleElement на Person, Targets to Parents и Sources to Children. Вы можете щелкнуть каждую метку, чтобы изменить ее.
Переименуйте элементы и средства соединителя.
Откройте окно обозревателя DSL, щелкнув вкладку в Обозреватель решений. Если вы не видите его, в меню "Вид " выберите пункт "Другие окна" и выберите обозреватель DSL. Обозреватель DSL отображается только в том случае, если схема определения DSL является активным окном.
Откройте окно свойств и поместите его таким образом, чтобы одновременно отображались обозреватель и свойства DSL.
В обозревателе DSL разверните редактор, вкладки панели элементов,< DSL> и инструменты.
Щелкните ExampleElement. Это элемент панели элементов, используемый для создания элементов.
В окно свойств измените свойство Name на Person.
Обратите внимание, что свойство Caption также изменяется.
Таким же образом измените имя средства ExampleConnector на ParentLink. Измените свойство Caption , чтобы оно не было копией свойства Name. Например, введите родительскую ссылку.
Перестройте DSL.
Сохраните файл определения DSL.
Щелкните "Преобразовать все шаблоны" на панели инструментов Обозреватель решений
Нажмите клавишу F5. Дождитесь появления экспериментального экземпляра Visual Studio.
В решении отладки в экспериментальном экземпляре Visual Studio откройте файл тестовой модели. Перетащите элементы на него из панели элементов. Обратите внимание, что названия инструментов и имена типов в обозревателе DSL изменились.
Сохраните файл модели.
Откройте TT-файл и замените вхождения старых типов и имен свойств новыми именами.
Убедитесь, что имя файла, указанное в файле TT, указывает тестовую модель.
Сохраните TT-файл. Откройте созданный файл, чтобы увидеть результат выполнения кода в TT-файле. Убедитесь, что это правильно.
Добавление свойств домена в классы
Добавьте свойства в класс домена, например, чтобы представить годы рождения и смерти человека.
Чтобы сделать новые свойства видимыми на схеме, необходимо добавить декораторы в фигуру, отображающую элемент модели. Также необходимо сопоставить свойства с декораторами.
Добавление свойств и их отображение
Добавьте свойства.
На схеме определения DSL щелкните правой кнопкой мыши класс домена Person , наведите указатель мыши на "Добавить" и выберите "Свойство домена".
Введите список новых имен свойств, таких как рождение и смерть. Нажмите клавишу ВВОД после каждого из них.
Добавьте декораторы, которые будут отображать свойства в фигуре.
Следуйте серой линии, которая расширяется от класса домена Person к другой стороне схемы. Это карта элементов схемы. Он связывает класс домена с классом фигуры.
Щелкните правой кнопкой мыши этот класс фигуры, наведите указатель мыши на "Добавить" и выберите пункт " Декоратор текста".
Добавьте два декоратора с такими именами, как BirthDecorator и DeathDecorator.
Выберите каждый новый декоратор и в окно свойств задайте поле "Положение". Это определяет, где будет отображаться значение свойства домена в фигуре. Например, задайте InnerBottomLeft и InnerBottomRight.
Сопоставите декораторы со свойствами.
Откройте окно сведений о DSL. Обычно она находится на вкладке рядом с окном вывода. Если вы не видите его, в меню "Вид " наведите указатель мыши на другие окна и нажмите кнопку DSL Details.
На схеме определения DSL щелкните строку, которая подключает класс домена Person к классу фигуры.
На вкладке "Карты декоратора" на вкладке "Сведения о DSL" установите флажок для распакованного декоратора. В поле Display Property выберите свойство домена, с которым оно сопоставлено. Например, сопоставить BirthDecorator с Birth.
Сохраните DSL, нажмите кнопку "Преобразовать все шаблоны" и нажмите клавишу F5.
На примере схемы модели убедитесь, что теперь можно щелкнуть выбранные позиции и ввести в них значения. Кроме того, при выборе фигуры "Человек" окно свойств отображает новые свойства "Рождение и смерть".
В TT-файле можно добавить код, который получает свойства каждого пользователя.
Определение новых классов
Классы и связи домена можно добавить в модель. Например, можно создать новый класс для представления городов, а также новое отношение, представляющее, что человек жил в городе.
Чтобы отличить различные типы на схеме модели, можно сопоставить классы домена с различными типами фигур или фигурами с различными геометриями и цветами.
Добавление и отображение нового класса домена
Добавьте класс домена и сделайте его дочерним элементом корневого каталога модели.
На схеме определения DSL щелкните инструмент "Внедрение отношений ", щелкните корневой класс FamilyTreeModel и щелкните пустую часть схемы.
Появится новый класс домена, подключенный к FamilyTreeModel с отношением внедрения.
Задайте его имя, например Город.
Примечание.
Каждый класс домена, кроме корневого каталога модели, должен быть целевым объектом по крайней мере одной связи внедрения, или он должен наследовать от класса, который является целью внедрения. По этой причине часто удобно создавать класс домена с помощью средства "Внедрение отношений".
Добавьте свойство домена в новый класс, например Name.
Добавьте связь ссылок между Person и Town.
Щелкните инструмент "Связь ссылок", щелкните "Человек" и выберите "Город".
Примечание.
Ссылочные связи представляют перекрестные ссылки из одной части дерева модели в другую.
Добавьте фигуру для представления городов на схемах моделей.
Перетащите геометрическую фигуру из панели элементов на схему и переименуйте ее, например TownShape.
В окно свойств задайте поля "Внешний вид" новой фигуры, такие как цвет заливки и геометрия.
Добавьте декоратор, чтобы отобразить имя города и переименовать его NameDecorator. Задайте свойство Position.
Сопоставить класс домена "Город" с TownShape.
Щелкните инструмент "Схема элементов" и выберите класс домена "Город" и класс фигуры TownShape.
На вкладке "Карты декоратора" окна "Сведения о DSL" с выбранным соединителем карты установите флажок NameDecorator и задайте для свойства Display Property значение Name.
Создайте соединитель для отображения связи между человеком и городами.
Перетащите соединитель из панели элементов на схему. Переименуйте его и задайте свойства внешнего вида.
Используйте средство сопоставления элементов схемы, чтобы связать новый соединитель с связью между Person и Town.
Создайте инструмент элемента для создания нового города.
В обозревателе DSL разверните редактор и вкладки панели элементов.
Щелкните правой кнопкой мыши <dsL> и нажмите кнопку "Добавить новый элемент".
Задайте свойство Name нового инструмента и задайте для свойства Class значение "Город".
Задайте свойство "Значок панели элементов". Щелкните [...] и в поле имени файла выберите файл значка.
Создайте инструмент соединителя для создания связи между городами и людьми.
Щелкните правой кнопкой мыши dsL> и нажмите кнопку "Добавить новый соединитель".<
Задайте свойство Name нового средства.
В свойстве ConnectionBuilder выберите построитель, содержащий имя связи Person-Town.
Задайте значок панели элементов.
Сохраните определение DSL, нажмите кнопку "Преобразовать все шаблоны" и нажмите клавишу F5.
В экспериментальном экземпляре Visual Studio откройте файл тестовой модели. Используйте новые средства для создания городов и связей между городами и людьми. Обратите внимание, что можно создавать ссылки только между правильными типами элементов.
Создайте код, который перечисляет город, в котором живет каждый человек. Текстовые шаблоны — это одно из мест, где можно запустить такой код. Например, можно изменить существующий файл Sample.tt в решении отладки, чтобы он содержал следующий код:
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" debug="true" #> <#@ output extension=".txt" #> <#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Sample.ftree'" #> <# foreach (Person person in this.FamilyTreeModel.People) { #> <#= person.Name #><#if (person.Town != null) {#> of <#= person.Town.Name #> <#}#> <# foreach (Person child in person.Children) { #> <#= child.Name #> <# } } #>
При сохранении файла *.tt он создаст дочерний файл, содержащий список людей и их резиденций. Дополнительные сведения см. в разделе "Создание кода на языке для конкретного домена".
Проверка и команды
Вы можете продолжить разработку этого DSL, добавив ограничения проверки. Эти ограничения — это методы, которые можно определить, чтобы убедиться, что модель находится в правильном состоянии. Например, можно определить ограничение, чтобы убедиться, что дата рождения ребенка позже, чем у его родителей. Функция проверки отображает предупреждение, если пользователь DSL пытается сохранить модель, которая нарушает какие-либо ограничения. Дополнительные сведения см. в разделе "Проверка" на языке конкретного домена.
Вы также можете определить команды меню, которые пользователь может вызвать. Команды могут изменять модель. Они также могут взаимодействовать с другими моделями в Visual Studio и с внешними ресурсами. Дополнительные сведения см. в разделе "Практическое руководство. Изменение стандартной команды меню".
Развертывание DSL
Чтобы разрешить другим пользователям использовать язык, зависящий от домена, вы распространяете файл расширения Visual Studio (VSIX). Это создается при сборке решения DSL.
Найдите VSIX-файл в папке bin решения. Скопируйте его на компьютер, на котором вы хотите установить его. На этом компьютере дважды щелкните ФАЙЛ VSIX. DSL можно использовать во всех экземплярах Visual Studio на этом компьютере.
Вы можете использовать ту же процедуру для установки DSL на своем компьютере, чтобы не использовать экспериментальный экземпляр Visual Studio.
Дополнительные сведения см. в разделе Развертывание решения на предметно-ориентированном языке.
Удаление старых экспериментальных DSLs
Если вы создали экспериментальные dsLs, которые больше не нужны, их можно удалить с компьютера, сбросив экспериментальный экземпляр Visual Studio.
Это приведет к удалению с компьютера всех экспериментальных DSLs и других экспериментальных расширений Visual Studio. Это расширения, которые были выполнены в режиме отладки.
Эта процедура не удаляет DSLs или другие расширения Visual Studio, которые были полностью установлены путем выполнения VSIX-файла.
Сброс экспериментального экземпляра Visual Studio
В меню "Пуск Windows" введите visual Studio, а затем выполните команду "Сброс экспериментального экземпляра Microsoft Visual Studio", соответствующую вашей версии Visual Studio.
Перестройте все экспериментальные dsLs или другие экспериментальные расширения Visual Studio, которые по-прежнему нужно использовать.