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

Чтобы определить язык для конкретного домена (DSL), вы создадите решение Visual Studio на основе шаблона. Ключевой частью решения является схема определения DSL, которая хранится в файле DslDefinition.dsl. Определение DSL определяет классы и фигуры DSL. После внесения изменений и добавления элементов можно добавить программный код для более детальной настройки DSL.

Если вы не знакомы с DSLs, рекомендуется работать с лабораторией средств DSL, которую можно найти на этом сайте: пакет SDK для визуализации и моделирования

Выбор решения шаблона

Для определения доменного языка необходимо установить следующие компоненты.

  • Visual Studio
  • Рабочая нагрузка разработки расширений Visual Studio (включает пакет SDK для Visual Studio)
  • Пакет SDK для моделирования (установка его в качестве отдельного компонента в Visual Studio)

Примечание.

Компонент Text Template Transformation (Преобразование текстовых шаблонов) автоматически устанавливается как часть рабочей нагрузки разработки расширений Visual Studio. Его также можно установить на вкладке Отдельные компоненты Visual Studio Installer в категории Пакеты SDK, библиотеки и платформы. Установите компонент Пакет SDK для моделирования со вкладки Отдельные компоненты.

Чтобы создать новый язык для конкретного домена, создайте новое решение Visual Studio с помощью шаблона проекта языка для конкретного домена.

Создание решения DSL

  1. Создайте проект языка для конкретного домена.

    Откроется мастер языка для конкретного домена и отображается список решений DSL шаблона.

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

    Каждый шаблон DSL определяет основной рабочий DSL. Этот DSL можно отредактировать в соответствии с вашими требованиями.

    Нажмите на каждый образец, чтобы получить дополнительную информацию.

    • Выберите поток задач, чтобы создать DSL с плавающей дорожкой. Дорожки — это вертикальные или горизонтальные разделы схемы.

    • Выберите модели компонентов, чтобы создать DSL с портами. Порты — это небольшие фигуры на краю более крупной фигуры.

    • Выберите схемы классов, чтобы определить DSL с фигурами секции. Фрагменты фигур содержат списки элементов.

    • Выберите минимальный язык в других случаях или если вы не уверены.

    • Выберите минимальный конструктор WinForm или минимальный конструктор WPF, чтобы создать DSL, отображаемый на поверхности Windows Forms или WPF. Вам нужно будет написать код для определения редактора. Дополнительные сведения см. в следующих разделах:

      Создание доменного языка на основе Windows Forms

      Создание доменного языка на основе WPF

  3. Введите расширение имени файла для DSL на соответствующей странице мастера. Это расширение будут использовать файлы, содержащие экземпляры DSL.

    • Выберите расширение имени файла, не связанное ни с одним другим приложением на вашем или другом компьютере, где планируется устанавливать DSL. Например, docx и htm будут неприемлемыми расширениями имен файлов.

    • Мастер предупредит, если расширение уже используется в качестве DSL. В этом случае выберите другое расширение имени файла. Можно также сбросить экземпляр экспериментального пакета SDK для Visual Studio, чтобы удалить старые экспериментальные конструкторы. В меню "Пуск Windows" введите visual Studio, а затем выполните команду "Сброс экспериментального экземпляра Microsoft Visual Studio", соответствующую вашей версии Visual Studio.

  4. Также можно изменить настройки на других страницах или оставить значения по умолчанию.

  5. Нажмите кнопку Готово.

    Мастер создаст решение, содержащее два или три проекта, и сгенерирует код из определения DSL.

    После этого пользовательский интерфейс примет следующий вид:

    конструктор dsl

    Данное решение определяет доменный язык. Дополнительные сведения см. в разделе "Общие сведения о пользовательском интерфейсе средств языка для конкретного домена".

Тестирование решения

Шаблон решения предоставляет рабочий DSL, который можно изменить или использовать как есть.

Чтобы протестировать решение нажмите клавишу F5 или комбинацию клавиш CTRL + F5. Новый экземпляр Visual Studio открывается в экспериментальном режиме.

В новом экземпляре Visual Studio в Обозреватель решений откройте пример файла. Он откроется в виде схемы с панелью элементов.

Если вы запускаете решение, созданное на основе шаблона "Минимальный язык ", экспериментальная Visual Studio будет выглядеть следующим образом:

Дерево примера языка для конкретного домена в Visual Studio

Работа с инструментами Создайте элементы и соедините их.

Закройте экспериментальный экземпляр Visual Studio.

Примечание.

После изменения DSL фигуры больше не будут отображаться в тестовом файле Sample. При этом возможность создавать новые элементы сохранится.

Изменение шаблона DSL

Переименуйте и оставьте некоторые или все классы доменов и фигур в шаблоне определения DSL. Новые имена классов должны быть действительными CLR-именами без пробелов и знаков препинания.

Рекомендуем сохранить следующие классы:

  • Корневой класс отображается в левом верхнем углу схемы определения DSL в разделе "Классы и связи". Присвойте ему другое имя, которое будет отличаться от имени DSL. Например, dsL с именем MusicLibrary может иметь корневой класс с именем Music.

  • Класс схемы отображается в правом нижнем углу схемы определения DSL в столбце "Элементы диаграммы". Возможно, чтобы его увидеть, экран придется прокрутить вправо. Обычно он называется диаграммой YourDsl.

  • Если вы использовали шаблон потока задач и хотите создать схемы с пловками, сохраните и переименуйте класс домена субъекта и фигуру ActorSwimlane.

    Удалите или переименуйте другие классы в соответствии со своими потребностями.

Шаблоны для определения DSL

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

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

  • Свойства домена того или иного класса и декораторы, отображающие их на схеме.

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

  • Настройка, требующая программного кода, например проверка ограничений или команда меню.

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

Примечание.

После добавления функции не забудьте щелкнуть "Преобразовать все шаблоны" на панели инструментов Обозреватель решений перед сборкой и запуском DSL.

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

Внедрение связей и установка ссылок на них

Следующий рисунок является примером модели данного DSL:

Модель экземпляра созданного DSL

Примечание.

"Модель" означает экземпляр DSL, который создается пользователем и обычно отображается в виде схемы. В данном разделе рассматривается как схема определения DSL, так и схемы модели, которые отображаются при использовании DSL.

Определение классов домена

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

Чтобы создать класс домена, можно перетащить из средства именованного класса домена на схему, а затем переименовать класс.

Дополнительные сведения см. в разделе "Свойства классов домена".

Создание отношения внедрения для каждого класса домена

Каждый класс домена, кроме корневого, должен быть целевым объектом хотя бы одного отношения внедрения или наследоваться от класса, который является таким целевым объектом.

В модели каждый элемент является узлом в едином дереве отношений внедрения. Источник и целевой объект отношения внедрения часто называют родительским и дочерним элементами.

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

Обычно если вы отображаете элемент внутри другого элемента, то показываете и его отношение к владельцу. В данном случае наиболее соответствующий родительский класс — это класс контейнера. Исключение имеет место, когда элемент внутри контейнера на самом деле является ссылкой на независимый элемент. В этом случае при удалении контейнера удаляется ссылка, но не объект, на который она указывает.

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

Отображение элемента Родительский класс (класс внедрения) Пример в шаблоне решения DSL
Фигура на схеме

Дорожка
Корневой класс DSL Минимальный язык

Поток задач: класс субъекта.
Фигура в дорожке Класс домена элементов, который отображаются в качестве дорожек. Поток задач: класс задач.
Элемент в списке в фигуре, удаляемый при удалении контейнера

Порт на краю фигуры
Класс домена, сопоставленный с фигурой контейнера Схема классов: класс атрибута.

Схема компонентов: класс порта.
Элемент в списке, не удаляемый при удалении контейнера Корневой класс DSL

Список с указанием связей и отношений
Не отображается напрямую Класс, часть которого он формирует

В примере Music Library, альбомы (Album) отображаются как прямоугольники, в которых перечислены названия песен (Song). Следовательно, родителем элемента Album является корневой класс Music (Музыка), а родителем элемента Song (Песня) — класс Album (Альбом).

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

Как правило, изменять имя отношения внедрения и его ролей не обязательно, так как они будут отслеживать имена классов автоматически.

Дополнительные сведения см. в разделе "Свойства отношений домена" и "Свойства ролей домена".

Примечание.

Внедрение не является наследованием. Дочерние элементы в отношении внедрения не наследуют свойства родительских элементов.

Добавление свойств домена в каждый класс домена

Свойства доменов хранят значения. Примеры: Имя, Название, Дата публикации.

Щелкните "Свойства домена" в классе, нажмите клавишу ВВОД и введите имя свойства. Тип свойства домена по умолчанию — строка. Если вы хотите изменить тип, выберите свойство домена и задайте тип в окне "Свойства ". Если нужный тип отсутствует в раскрывающемся списке, см. статью "Добавление типов свойств".

Задайте свойство "Имя элемента". Выберите свойство домена, которое может использоваться для определения элементов в Обозревателе языка. Например, в классе домена Song (Песня) можно выбрать свойство домена "Название". В окне "Свойства" задайте значение "Имя элементаtrue".

Создание производных классов доменов

Если у классов доменов должны быть экземпляры, которые наследуют его свойства и отношения, можно создать классы, которые являются производными от него. Например, класс Album (Альбом) может иметь производные классы WMA и MP3.

Создайте производный класс с помощью средства класса домена.

Щелкните средство наследования, щелкните производный класс и выберите базовый класс.

Рекомендуется задать модификатор наследования базового класса абстрактным. Если вам могут понадобиться экземпляры базового класса, создайте для них отдельные производные классы.

Производные классы наследуют свойства и роли базовых классов.

Чистка схемы определения DSL

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

Для перемещения классов доменов и фигур используйте сочетания клавиш CTRL + стрелка вверх и CTRL + стрелка вниз.

Проверка классов доменов

Чтобы проверить новые классы доменов, сделайте следующее.
  1. Нажмите кнопку "Преобразовать все шаблоны" на панели инструментов Обозреватель решений, чтобы создать код конструктора DSL. Этот шаг можно автоматизировать. Дополнительные сведения см. в разделе "Автоматизация преобразования всех шаблонов".

  2. Создайте и запустите DSL. Нажмите клавишу F5 или CTRL+F5, чтобы запустить новый экземпляр Visual Studio в экспериментальном режиме. В экспериментальном экземпляре Visual Studio откройте или создайте файл с расширением имени файла dsL.

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

    В обозревателе представлен вид модели в качестве дерева.

  4. Создание новых элементов. Щелкните правой кнопкой мыши корневой узел в верхней части и нажмите кнопку "Добавить новыйкласс".

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

  5. При создании новых экземпляров следите за тем, чтобы все экземпляры получали разные имена. Это произойдет только в том случае, если вы задали флаг "Имя элемента" в свойстве домена.

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

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

Определение фигур на схеме

Вы можете определить классы элементов, которые отображаются на схеме в виде прямоугольников, эллипсов или ярлыков.

Определение класса элементов, которые отображаются на схеме в виде фигур

  1. Определите и проверьте класс домена, как описано в разделе"Определение классов домена".

    • Родителем класса должен быть корневой класс. Это значит, что между корневым классом и новым классом домена должно существовать отношение внедрения.

    • Если в схеме есть дорожки, то родителем может быть класс домена, сопоставленный с дорожкой. Прежде чем продолжить работу с этой процедурой, ознакомьтесь с определением DSL с плавающей дорожкой.

  2. Добавьте класс фигуры для представления элементов на схеме модели. Перетащите один из следующих инструментов на схему определения DSL.

    • Геометрическая фигура предоставляет прямоугольник или многоточие.

    • Фигура изображения отображает предоставленное изображение.

    • Фигура секции — это прямоугольник, содержащий один или несколько списков элементов.

      Переименуйте класс фигуры, который отображается в правой части схемы определения DSL под фигурами и соединителями.

  3. Определите изображение, если вы создали фигуру изображения.

    1. Создайте файл изображения любого размера. Поддерживаются форматы BMP, JPEG, GIF и EMF.

    2. В Обозревателе решений добавьте файл в каталог решения Dsl\Resources.

    3. Вернитесь в схему определения DSL и выберите новый класс фигуры изображения.

    4. В окно свойств щелкните свойство Image.

    5. В диалоговом окне "Выбор изображения" щелкните раскрывающееся меню в разделе "Имя файла" и выберите изображение.

  4. Добавьте декораторы текста в фигуру, чтобы отобразить свойства домена.

    Чтобы отобразить имя или название элемента модели, потребуется хотя бы один декоратор.

    Щелкните правой кнопкой мыши заголовок класса фигуры, наведите указатель на "Добавить", а затем щелкните " Декоратор текста". Задайте имя декоратора и в окно свойств задайте его положение.

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

    Щелкните инструмент "Схема элементов" и выберите класс домена, а затем выберите класс фигуры.

  6. Сопоставите свойства с декораторами текста.

    1. Выберите серую линию между классом домена и классом фигуры, которая представляет карту элементов схемы.

    2. В окне сведений dsL щелкните вкладку "Декоратор" Карты. Если окно сведений о DSL не отображается, в меню "Вид" наведите указатель мыши на другие окна и нажмите кнопку DSL Details. Часто нужно поднять верхнюю часть окна, чтобы увидеть все его содержимое.

    3. Выберите имя декоратора. В разделе "Отображаемое свойство" выберите имя свойства класса домена. Повторите эти шаги для каждого декоратора.

      Если вы хотите отобразить свойство связанного элемента, щелкните навигатор дерева раскрывающегося списка в разделе Path, чтобы отобразить свойство.

    4. Возле имени каждого декоратора должен быть установлен флажок.

      Сопоставление фигур и окно сведений DSL

  7. Создайте элемент панели элементов для создания элементов класса домена.

    1. В Обозреватель DSL разверните узел редактора и все его вложенные узлы.

    2. Щелкните правой кнопкой мыши узел на вкладках панели элементов с тем же именем, что и DSL, например MusicLibrary. Нажмите кнопку "Добавить элемент"

      Примечание.

      Если щелкнуть правой кнопкой мыши узел "Сервис" , вы не увидите средство добавления элементов. Вместо этого необходимо щелкнуть узел на уровень выше.

    3. В окно свойств с выбранным средством нового элемента задайте класс домена, который вы недавно добавили.

    4. Задайте заголовок и подсказку.

    5. Задайте значок панели элементов значку , который появится на панели элементов. Можно выбрать новый значок или значок, который уже используется для другого инструмента.

      Чтобы создать новый значок, откройте dsl\Resources в Обозреватель решений. Скопируйте и вставьте один из существующих BMP-файлов средства элемента. Переименуйте вставленную копию, а затем откройте ее двойным щелчком кнопки мыши для редактирования.

      Вернитесь к схеме определения DSL, выберите средство и в окно свойств щелкните [...] на значке панели элементов. В диалоговом окне выбора растрового рисунка выберите файл .BMP в раскрывающемся меню.

    Дополнительные сведения см. в разделе "Свойства геометрических фигур и свойств фигур изображений".

Тестирование Фигур

  1. Нажмите кнопку "Преобразовать все шаблоны" на панели инструментов Обозреватель решений, чтобы создать код конструктора DSL.

  2. Создайте и запустите DSL. Нажмите клавишу F5 или CTRL+F5, чтобы запустить новый экземпляр Visual Studio в экспериментальном режиме. В экспериментальном экземпляре Visual Studio откройте или создайте файл с расширением имени файла dsL.

  3. Убедитесь, что средства элементов отображаются на панели элементов.

  4. Создайте фигуры путем перетаскивания из средства на схему модели.

  5. Убедитесь, что отображается каждый декоратор текста и что:

    1. Его можно изменить, если только вы не задали флаг "Только чтение пользовательского интерфейса" в свойстве домена.

    2. в случае изменения свойства в окне"Свойства" или в декораторе другой вид обновляется.

    После первого тестирования фигуры можно откорректировать некоторые свойства и добавить расширенные свойства. Дополнительные сведения см. в разделе "Настройка и расширение языка для конкретного домена".

Определение ссылочных связей

Между любым классом домена источника и классом домена целевого объекта можно определить ссылочное отношение. Ссылочные отношения обычно отображаются на схеме в виде соединителей — линий между фигурами.

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

Модель экземпляра созданного DSL

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

Определение ссылочного отношения

Щелкните инструмент ссылочного отношения, затем класс домена источника отношения и, наконец, целевой класс домена. Целевой класс может быть таким же как и класс источника.

Каждое отношение имеет две роли, представленные линией с каждой стороны окна отношений. Можно выбрать каждую роль и настроить ее свойства в окне "Свойства".

Рассмотрите возможность переименования ролей. Например, в отношении между персонами можно изменить имена по умолчанию на "Родители" и "Дети", "Руководитель" и "Подчиненные", "Преподаватель" и "Студент" и т. д.

При необходимости настройте умножение каждой роли. Если у каждой персоны должно быть не больше одного Руководителя, укажите для параметра кратности под ярлыком "Руководитель" в схеме значение "0..1".

Добавьте свойства домена в связь. На рисунке отношение между исполнителем и альбомом имеет свойство роли.

Задайте свойство "Разрешить дубликаты" связи, если между одной парой элементов модели может существовать несколько ссылок одного класса. Например, можно разрешить Преподавателю обучать одного и того же Студента нескольким Дисциплинам.

Карты фигур для соединителей

Дополнительные сведения см. в разделе "Свойства отношений домена" и "Свойства ролей домена".

Определение соединителя для отображения отношения

Соединитель отображает линию между двумя фигурами в схеме модели.

Перетащите средство Подключение or на схему определения DSL.

Добавьте текстовые декораторы если необходимо отобразить ярлыки на соединителе. Установите их расположение. Чтобы разрешить пользователю перемещать декоратор текста, задайте его свойство Is Moveable .

Используйте средство сопоставления элементов схемы, чтобы связать соединитель с ссылочной связью.

Выбрав схему элемента схемы, откройте окно сведений DSL и откройте вкладку "Декоратор Карты".

Выберите каждый декоратор и задайте для свойства Display правильный домен.

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

Определение средства построителя подключений

В окне Обозреватель DSL разверните узел редактора и все его дочерние элементы.

Щелкните правой кнопкой мыши узел с тем же именем, что и DSL, и нажмите кнопку "Добавить новую Подключение ion Tool".

Выбрав новый инструмент, в окне "Свойства":

  • Задайте заголовок и подсказку.

  • Щелкните Подключение построитель и выберите соответствующий построитель для новой связи.

  • Установите значок панели элементов на значок , который вы хотите появить на панели элементов. Можно выбрать новый значок или значок, который уже используется для другого инструмента.

    Чтобы создать новый значок, откройте dsl\Resources в Обозреватель решений. Скопируйте и вставьте один из существующих BMP-файлов средства элемента. Переименуйте вставленную копию, а затем откройте ее двойным щелчком кнопки мыши для редактирования.

    Вернитесь к схеме определения DSL, выберите средство и в окно свойств щелкните [...] на значке панели элементов. В диалоговом окне выбора растрового рисунка выберите файл .BMP в раскрывающемся меню.

Тестирование ссылочного отношения и соединителя
  1. Нажмите кнопку "Преобразовать все шаблоны" на панели инструментов Обозреватель решений, чтобы создать код конструктора DSL.

  2. Создайте и запустите DSL. Нажмите клавишу F5 или CTRL+F5, чтобы запустить новый экземпляр Visual Studio в экспериментальном режиме. В экспериментальном экземпляре Visual Studio откройте или создайте файл с расширением имени файла dsL.

  3. Убедитесь, что средство подключения появится на панели элементов.

  4. Создайте фигуры путем перетаскивания из средства на схему модели.

  5. Создайте соединения между фигурами. Выберите соединитель, щелкните фигуру, а затем выберите другую фигуру.

  6. Убедитесь, что нельзя создавать подключения между недопустимыми классами. Например, если установлено отношение между Альбомами и Исполнителями, убедитесь, что нельзя связать Исполнителей с Исполнителями.

  7. Убедитесь, что умножение правильно. Например, убедитесь, что вы не можете подключить пользователя к нескольким диспетчерам.

  8. Убедитесь, что отображается каждый декоратор текста и что:

    1. Его можно изменить, если только вы не задали флаг "Только чтение пользовательского интерфейса" в свойстве домена.

    2. в случае изменения свойства в окне"Свойства" или в декораторе другой вид обновляется.

    После первого тестирования соединителя можно откорректировать некоторые свойства и добавить расширенные свойства. Дополнительные сведения см. в разделе "Настройка и расширение языка для конкретного домена".

Определение фигур, содержащих списки: фигуры секции

Фигура секции содержит один или несколько списков элементов. Например, в DSL Music Library можно использовать фигуру секции для представления музыкальных Альбомов. В каждом Альбоме есть список Песен.

Фигура секции

Самый простой способ добиться этого эффекта в определении DSL — это определить один класс домена для контейнера и один класс домена для каждого списка. Класс контейнера сопоставлен с фигурой секции.

Карта фигур

Дополнительные сведения см. в разделе "Свойства фигур секции".

Определение фигуры секции

  1. Создайте класс домена контейнера. Щелкните средство "Внедрение отношений", щелкните корневой класс модели и щелкните пустую часть схемы определения DSL. Это создаст класс домена, который на рисунке примера называется Album.

    В качестве альтернативы вместо встраивания в корневой класс можно встроить контейнер в класс домена, сопоставленный с дорожкой.

    Добавьте свойство домена, например Name в класс, и задайте его флаг "Имя элемента" в окно свойств.

  2. Создайте класс домена элемента списка. Щелкните инструмент "Внедрение связей", щелкните класс контейнера (альбом) и щелкните пустую часть схемы. Это создаст класс домена, который на рисунке примера называется Song (Песня).

    Добавьте свойство домена, например Title в класс, и задайте его флаг Is Element Name .

    Добавьте другие свойства домена.

    Добавьте по классу домена для каждого списка элементов, который необходимо отобразить.

  3. Чтобы смешать несколько типов элементов в списке, создайте классы, наследуемые от класса списка. Сделайте класс списка абстрактным, задав модификатор наследования.

    Например, если вы хотите, чтобы классическая музыка сортировалась по композитору, а не по исполнителю, можно создать в классе Song (Песня) два подкласса: ClassicalSong (Классические) и NonClassicalSong (Не классические).

  4. Создайте фигуру отсека. Перетащите из средства "Фигура отсека" на схему определения DSL.

    Добавьте текстовый декоратор и укажите для него имя.

    Добавьте секцию и укажите для нее имя.

  5. Чтобы позволить пользователю скрыть секции списка, щелкните правой кнопкой мыши класс фигуры отсека, наведите указатель мыши на "Добавить" и нажмите кнопку "Развернуть или свернуть декоратор". В окне "Свойства" задайте расположение декоратора.

  6. Щелкните инструмент "Схема элементов" и выберите класс домена контейнера, а затем щелкните фигуру отсека.

  7. Выберите связь карты элемента схемы между классом домена и фигурой. В окне сведений о DSL:

    1. Щелкните вкладку "Декораторы ". Щелкните имя декоратора и выберите соответствующий элемент в разделе "Отображаемое свойство". Убедитесь, что возле имени каждого декоратора установлен флажок.

    2. Перейдите на вкладку "Раздел Карты".

      Выберите имя секции.

      В разделе "Путь к коллекции отображаемых элементов" перейдите к классу элементов списка (Song). Щелкните стрелку раскрывающегося меню, чтобы воспользоваться инструментом навигации.

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

Примечание.

Используя поля "Путь" в карте декораторов и полях в карте секций, установите более сложные отношения между классами доменов и фигурой секции.

Определение инструмента для создания фигуры

  1. Создайте элемент панели элементов для создания элементов класса домена.

  2. В Обозреватель DSL разверните узел редактора и все его вложенные узлы.

  3. Щелкните правой кнопкой мыши узел на вкладках панели элементов с тем же именем, что и DSL, например MusicLibrary. Нажмите кнопку "Добавить элемент"

    Примечание.

    Если щелкнуть правой кнопкой мыши узел "Сервис" , вы не увидите средство добавления элементов. Вместо этого необходимо щелкнуть узел на уровень выше.

  4. В окно свойств с выбранным средством нового элемента задайте класс домена, который вы недавно добавили.

  5. Задайте заголовок и подсказку.

  6. Задайте значок панели элементов значку , который появится на панели элементов. Можно выбрать новый значок или значок, который уже используется для другого инструмента.

    Чтобы создать новый значок, откройте dsl\Resources в Обозреватель решений. Скопируйте и вставьте один из существующих BMP-файлов средства элемента. Переименуйте вставленную копию, а затем откройте ее двойным щелчком кнопки мыши для редактирования.

    Вернитесь к схеме определения DSL, выберите средство и в окно свойств щелкните [...] на значке панели элементов. В диалоговом окне выбора растрового рисунка выберите файл BMP в раскрывающемся меню.

Тестирование фигуры сегмента

  1. Нажмите кнопку "Преобразовать все шаблоны" на панели инструментов Обозреватель решений, чтобы создать код конструктора DSL.

  2. Создайте и запустите DSL. Нажмите клавишу F5 или CTRL+F5, чтобы запустить новый экземпляр Visual Studio в экспериментальном режиме. В экспериментальном экземпляре Visual Studio откройте или создайте файл с расширением имени файла dsL.

  3. Убедитесь, что средство появится на панели элементов.

  4. Перетащите инструмент в схему модели. Будет создана новая фигура.

    Убедитесь, что имя элемента отображается и автоматически получает значение по умолчанию.

  5. Щелкните правой кнопкой мыши заголовок новой фигуры и нажмите кнопку "Добавить элемент списка". В этом примере используется команда Add Song.

    Убедитесь, что элемент отображается в списке под новым именем.

  6. Щелкните один из элементов списка и проверьте окно "Свойства". В нем должны появиться свойства элементов списка.

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

    Созданный обозреватель DSL

    После первого тестирования фигуры секции можно откорректировать некоторые свойства и добавить расширенные свойства. Дополнительные сведения см. в разделе "Настройка и расширение языка для конкретного домена".

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

Например, можно добавить вторую секцию в элемент AlbumShape, отображающий список Исполнителей, которые связаны с Альбомом.

В этом случае секция должна отображать связь вместо элемента, на который она ссылается. Это связано с тем, что когда пользователь выбирает элемент в отсеке и нажимает DELETE, необходимо удалить ссылку, а не элемент, на который ссылается ссылка.

Тем не менее можно сделать так, чтобы имя элемента, на который создана ссылка, отображалось в секции.

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

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

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

  3. Задайте путь для отображения свойства , чтобы перейти из ссылки на целевой элемент. В примере это художник.

  4. Задайте для свойства Display Property соответствующее свойство целевого элемента, например Name.

  5. Преобразование всех шаблонов, сборка и запуск DSL и открытие тестовой модели.

  6. В схеме модели создайте соответствующие классы фигур, присвойте им имена и создайте связь между ними. В фигуре секции должны появиться имена связанных элементов.

  7. Выберите связь или элемент в фигуре секции. Связь и элемент должны исчезнуть.

Определение портов на границе другой фигуры

Порт — это фигура, которая находится на границе с другой фигурой.

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

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

  • Класс домена, который представляет контейнер портов (Component).

  • Класс домена, который представляет порты. В нашем примере это ComponentPort.

  • Отношение внедрения между классом домена контейнера и классом домена порта. Дополнительные сведения см. в разделе "Определение классов домена".

  • Если в одном контейнере нужно смешать разные типы портов, можно создать подклассы класса домена порта. В данном примере InPort и OutPort наследуются от ComponentPort.

  • Класс домена контейнера может быть сопоставлен с любым видом фигуры. В этом примере используется ComponentShape. Дополнительные сведения см. в разделе "Определение фигур".

  • Классы доменов портов сопоставлены с фигурами портов. Можно сопоставить либо производные классы с отдельными классами фигур портов, либо базовый класс с одним классом фигуры порта.

    В других отношениях фигуры портов ведут себя так, как описано в разделе "Определение фигур".

    Дополнительные сведения см. в разделе "Свойства фигур портов".

Определение DSL с плавающей дорожкой

Дорожки — это вертикальные или горизонтальные разделения схемы. Каждая дорожка соответствует элементу модели. Определение DSL требует одного класса домена для элементов дорожек.

Лучший способ создать DSL с дорожками — это создать новое решение DSL и выбрать шаблон решения "Поток задач". В определении DSL класс субъекта является классом домена, сопоставленным с дорожкой. Переименуйте его и другие классы в соответствии со своим проектом.

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

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

Дополнительные сведения см. в разделе "Свойства пловцов".

Добавление типов свойств

Доменные перечисления и литералы

Доменное перечисление — это тип с несколькими значениями литералов.

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

Чтобы добавить литералы перечисления в перечисление домена, щелкните правой кнопкой мыши перечисление домена в Обозреватель DSL и нажмите кнопку "Добавить новый литерал перечисления".

По умолчанию свойство, которое имеет тип перечисления, может иметь только одно значение перечисления за раз. Если вы хотите, чтобы пользователи и программисты могли задать любое сочетание значений - битовое поле" — задайте свойство IsFlags перечисления.

Внешние типы

Если вы задаете тип свойства домена, если вы не найдете нужный тип в раскрывающемся списке "Тип ", можно добавить внешний тип. Например, можно добавить в список тип System.Drawing.Color .

Чтобы добавить тип, щелкните правой кнопкой мыши корень модели в dsL Обозреватель и нажмите кнопку "Добавить новый внешний тип". В окно свойств задайте для имени цвет и пространство имен System.Drawing. Этот тип теперь отображается в dsL Обозреватель в разделе "Типы доменов". и будет доступен для выборе при установке типа свойства домена.

Настройка DSL

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

Существуют два метода расширения определения DSL.

  1. Точная настройка DSL с использованием многочисленных функций определения DSL. Например, можно сделать единое средство подключения, способное создавать несколько типов соединителей, и настроить правила, по которым удаление одного элемента ведет к удалению связанных элементов. Большинство этих техник требуют установки значений в определении DSL, а некоторые — написания нескольких строк программного кода.

    Дополнительные сведения см. в разделе "Настройка и расширение языка для конкретного домена".

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

Изменение определения DSL

При создании любого элемента в определении DSL многие значения устанавливаются автоматически. Установленные значения можно изменять. Это упрощает разработку DSL и в то же время позволяет осуществлять значительные настройки.

Например, когда фигура сопоставляется с элементом, путь родительского элемента сопоставления автоматически устанавливается согласно отношению внедрения соответствующего класса домена. Если же впоследствии отношение внедрения корректируется, путь родительского элемента автоматически не изменяется.

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

См. также практическое руководство. Изменение пространства имен конкретного домена.

Устранение неполадок

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

Проблема Предложение
Изменения, внесенные в файл определения DSL, не работают. Щелкните "Преобразовать все шаблоны" на панели инструментов выше Обозреватель решений, а затем перестроите решение.
Фигуры показывают имя декоратора вместо значения свойства. Настройте сопоставление декоратора. В схеме определения DSL щелкните карту элементов схемы — это серая линия между классом домена и классом фигуры.

Откройте окно сведений о DSL. Если вы не видите его, в меню "Вид" наведите указатель мыши на другие окна и нажмите кнопку DSL Details.

Щелкните вкладку "Декоратор" Карты. Выберите имя декоратора. Убедитесь, что флажок рядом с ним установлен. В разделе "Отображаемое свойство" выберите имя свойства домена.

Дополнительные сведения см. в разделе "Фигуры" на схеме.
В Обозревателе DSL не удается добавить коллекцию. Например, при щелчке правой кнопкой мыши по пункт "Инструменты" в меню не отображается команда "Добавить инструмент".

В Обозревателе DSL не удается добавить элемент в список.
Щелкните элемент над интересующим вас узлом правой кнопкой мыши. Если вы хотите добавить элемент в список, ищите команду "Добавить" не в узле списка, а во владельце.
Я создал класс домена, но не могу создать экземпляры в Обозревателе языка. Каждый класс домена, кроме корневого, должен быть целевым объектом отношения внедрения.
В Обозревателе DSL элементы отображаются только с именами их типов. В определении DSL выберите доменное свойство класса и в окно свойств задайте для параметра Is Name значение true.
DSL всегда открывается в XML-редакторе. Это происходит из-за ошибки чтения файла. Даже если вы исправите эту ошибку, необходимо будет специально сбросить редактор, чтобы он больше не выступал в качестве конструктора DSL.

Щелкните правой кнопкой мыши элемент проекта, нажмите кнопку "Открыть с помощью" и выберите "Конструктор Azure" (по умолчанию).
Панель элементов в DSL не отображается после изменения имен сборки. Проверьте и обновите DslPackage\GeneratedCode\Package.tt Дополнительные сведения см. в разделе "Практическое руководство. Изменение пространства имен конкретного домена языка".
Панель элементов в DSL не отображается, хотя имя сборки не изменялось.

Либо появляется сообщение о невозможности загрузить расширение.
Сбросьте экспериментальный экземпляр и выполните сборку решения заново.

1. В меню Windows в разделе "Все программы" разверните пакет SDK Visual Studio, а затем средства и нажмите кнопку "Сброс экспериментального экземпляра Microsoft Visual Studio".
2. В меню "Сборка " нажмите кнопку "Перестроить решение".