Написание кода для настройки языка для конкретного домена
В этом разделе показано, как использовать пользовательский код для доступа, изменения или создания модели на языке для конкретного домена (DSL).
Контекст написания кода для DSL
Существует несколько контекстов, в которых можно написать код, который работает с DSL:
Пользовательские команды. Вы можете создать команду, которую пользователи могут вызвать, щелкнув правой кнопкой мыши схему и изменив модель. Дополнительные сведения см. в разделе "Практическое руководство. Добавление команды в контекстное меню".
Проверка. Вы можете написать код, который проверяет, находится ли модель в правильном состоянии. Дополнительные сведения см. в разделе "Проверка" на языке конкретного домена.
Переопределение поведения по умолчанию. Вы можете изменить множество аспектов кода, созданного из DslDefinition.dsl. Дополнительные сведения см. в разделе "Переопределение и расширение созданных классов".
Преобразование текста. Текстовые шаблоны, содержащие код, который обращается к модели и создает текстовый файл, например для создания кода программы. Дополнительные сведения см. в разделе "Создание кода на языке для конкретного домена".
Другие расширения Visual Studio. Можно написать отдельные расширения VSIX, которые считывают и изменяют модели. Дополнительные сведения см. в разделе "Практическое руководство. Открытие модели из файла в коде программы"
Хранилище в памяти
Экземпляры классов, определенных в DslDefinition.dsl, хранятся в структуре данных, называемой хранилищем в памяти (IMS) или Store. Классы, определенные в DSL, всегда принимают Store в качестве аргумента конструктора. Например, если dsL определяет класс с именем Example
:
Example element = new Example (theStore);
Хранение объектов в Магазине, а не как обычные объекты, обеспечивает несколько преимуществ.
Транзакции. Вы можете сгруппировать ряд связанных изменений в транзакцию:
using (Transaction t = store.TransactionManager.BeginTransaction("updates")) { // make several changes to Store elements here t.Commit(); }
Если во время изменений возникает исключение, чтобы окончательное
Commit()
не было выполнено, магазин сбрасывается до предыдущего состояния. Этот подход помогает убедиться, что ошибки не покидают модель в несогласованном состоянии. Дополнительные сведения см. в статье "Навигация и обновление модели" в коде программы.Двоичные связи. Если вы определяете связь между двумя классами, экземпляры в обоих концах имеют свойство, которое переходит к другому концу. Два конца всегда синхронизированы. Например, если вы определяете отношение родительства с ролями с именем "Родители и дети", можно написать следующее:
John.Children.Add(Mary)
Оба из следующих выражений теперь имеют значение true:
John.Children.Contains(Mary)
Mary.Parents.Contains(John)
Вы также можете достичь того же эффекта, написав:
Mary.Parents.Add(John)
Дополнительные сведения см. в статье "Навигация и обновление модели" в коде программы.
Правила и события. Вы можете определить правила, которые выполняются при каждом внесении указанных изменений. Правила используются, например, для поддержания фигур на схеме в актуальном состоянии с элементами модели, которые они присутствуют. Дополнительные сведения см. в статье "Реагирование на изменения" и "Распространение изменений".
Сериализация. Магазин предоставляет стандартный способ сериализации объектов, содержащихся в файле. Правила сериализации и десериализации можно настроить. Дополнительные сведения см. в разделе "Настройка файлов служба хранилища и сериализации XML".