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


Переопределение и расширение созданных классов

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

Механизмы расширяемости

Предоставляется несколько механизмов, позволяющих расширить созданный код.

Переопределение методов в частичном классе

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

Например, если в определении DSL определяется класс домена с именем Book, можно написать пользовательский код, добавляющий методы переопределения:

public partial class Book
{
   protected override void OnDeleting()
   {
      MessageBox.Show("Deleting book " + this.Title);
      base.OnDeleting();
   }
}

Примечание.

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

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

Двойные производные классы

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

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

Например, в примере Library.dsl CirculationBook класс домена имеет Generates``Double Derived значение trueсвойства. Созданный код для этого класса домена содержит два класса:

  • CirculationBookBase— абстрактный и содержащий все методы и свойства.

  • CirculationBook, производный от CirculationBookBase. Он пуст, за исключением его конструкторов.

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

Этот метод можно использовать со всеми типами элементов, включая элементы модели, связи, фигуры, схемы и соединители. Можно также переопределить методы других созданных классов. Некоторые созданные классы, такие как Панель элементовHelper, всегда являются двойными.

Пользовательские конструкторы

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

Если вы хотите предоставить собственный конструктор, это можно сделать, задав Has Custom Constructor для класса домена в определении DSL. При нажатии кнопки "Преобразовать все шаблоны" созданный код не будет включать конструктор для этого класса. Он будет включать вызов отсутствующий конструктор. Это приводит к возникновению отчета об ошибке при сборке решения. Дважды щелкните отчет об ошибке, чтобы просмотреть комментарий в созданном коде, который объясняет, что необходимо предоставить.

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

Помеченные точки расширения

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

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

Правила

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

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

Хранение событий

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

События .NET

Вы можете подписаться на некоторые события на фигурах. Например, можно прослушивать щелчки мыши фигуры. Необходимо написать код, который подписывается на событие для каждого объекта. Этот код можно записать в переопределении InitializeInstanceResources().

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

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