Переопределение и расширение созданных классов
Определение DSL платформы, на которой можно построить мощный набор средств, которые основаны на доменном языке.Многие расширения и приспособлений могут быть произведены путем переопределения и расширить классы, сформированные из определения DSL.Эти классы включают не только классы, которые были явно заданы доменных в схеме определения DSL, но и другие классы, которые определяют область элементов в обозревателе, сериализацию и т д
Механизмы расширяемости
Предоставляется несколько механизмов, позволяющих позволяет расширить сгенерированный код.
Переопределение методов в разделяемом классе
Определения разделяемого класса позволяют класс, который необходимо определить в нескольких местах.Это позволяет разделить созданный код из кода, который будет написан вручную.В ручн-записыванном коде можно переопределить наследуемые классы созданным кодом.
Например, если в определении DSL указывается именованный доменный класс Bookможно написать пользовательский код, который добавляет методы переопределения:
public partial class Book
{
protected override void OnDeleting()
{
MessageBox.Show("Deleting book " + this.Title);
base.OnDeleting();
} }
Примечание |
---|
Чтобы переопределить методы в созданном классе всегда напишите код в файле, который отделен от создаваемых файлов.Как правило, файл находится в папке с именем CustomCode.При внесении изменений к созданному коду, они будут утеряны при повторно сформируйте значение идентификатора кода из определения DSL. |
Чтобы узнать, какие методы можно переопределить, переопределение типа в классе, за которой следуют пробел.В подсказке IntelliSense скажет, какие методы можно переопределить.
Двойн-Выведенные классы
Большинство методов в создаваемых классах наследуются из предопределенных набора классов в пространстве имен моделирования.Однако некоторые методы определяются в сгенерированном коде.Обычно это означает, что нельзя переопределить их. нельзя переопределить в разделяемом классе методы, определенные в другом частично определении одного и того же класса.
Однако можно переопределить эти методы, установив Создает производный тип double пометить для доменного класса.Это приводит к 2 класса не будет создан, один абстрактным базовым классом другого.Все методы и определения свойства в базовом классе, и только конструктор в производном классе.
Например, в образце Library.dsl, CirculationBook доменный класс содержит GeneratesDouble Derived набор свойств к true.Созданный код доменного класса содержит 2 класса:
CirculationBookBase- абстрактный и, содержащий все методы и свойства.
CirculationBook, из которого наследуется CirculationBookBase.Он пуст, за исключением его конструкторов.
Для переопределения любого метода создается частично определения производного класса как CirculationBook.Можно переопределить и созданные методы и методы моделирования, унаследованные от платформы.
Этот метод можно использовать со всеми типами элементов, включая элементы модели отношений, фигуры схемы и соединителей.Можно также переопределить методы других созданных классов.Некоторые созданные классы, как ToolboxHelper всегда двойн-выведены.
Пользовательские конструкторы
Нельзя переопределить конструктор.Даже в двойн-выведенных классах, конструктор должен находиться в производном классе.
Если нужно обеспечить собственный конструктор, то это можно сделать, установив Has Custom Constructor для доменного класса в определении DSL.При щелчке Преобразовать все шаблонысозданный код не включает конструктор для этого класса.Он включает вызов пропавшему конструктор.Это приводит к тому, что отчет об ошибке при построении решения.Дважды щелкните отчет об ошибках, чтобы увидеть комментарий в созданном коде, который описывает, что необходимо предоставить.
Запишите определение разделяемого класса в файле, который отделен от созданных файлов и предоставьте конструктор.
Точки расширения, помеченного
Точка расширения помеченного размещение в определении DSL, где можно задать свойство или флажок, чтобы указать, что обеспечите пользовательский метод.Пользовательские конструкторы один пример.Другие примеры включают параметр Kind свойства домена на вычисляемый или пользовательское хранилище или устанавливать Изготовлена custom пометить в построителе соединения.
В каждом случае при размещении пометить и код ошибки построения, повторно сформируйте значение идентификатора.Щелкните дважды ошибку для просмотра комментарий, который объясняет, что необходимо предоставить.
Правила
Диспетчер транзакций позволяет указать правила, которые выполняются до окончания транзакции, в которой выделенный произошло событие, например изменение в свойстве.Правила обычно используются для поддержки синхронизм между различными элементами в хранилище.Например, используемые правила убедиться, что схема показывает текущее состояние модели.
Правила, определенные на уровне в-класса, чтобы не приходилось содержать код, который регистрирует правило для каждого объекта.Дополнительные сведения см. в разделе Правила распространяют изменения в пределах модели.
Храните события
Хранилище моделирования предоставляет механизм событий, который можно использовать для прослушивания для определенных типов изменений в хранилище, включая добавление и удаление элементов, изменения значений свойств и т дВызываются обработчики событий после конца транзакции, в которой были внесены изменения.Обычно эти события используются для обновления ресурсам вне хранилища.
События платформы .NET
Можно подписаться с определенным событиям на фигурах.Например, можно прослушивать щелчка мыши на фигуру.Необходимо написать код этому подписаться на событие для каждого объекта.Этот код можно записать в переопределенном методе InitializeInstanceResources ().
Некоторые события формируются на ShapeFields, используемые для рисования оформители на форму.Пример см. в разделе Практическое руководство. Перехват щелчка фигуры или декоратора.
Эти события обычно не возникших внутри транзакции.Необходимо создать транзакцию, если необходимо внести изменения в хранилище.