Xafari Expression Designer

Общее описание

Для описания динамических правил расчета показателей в прикладной системе примеряют вычисляемые в run-time формулы. Devexpress XAF содержит специализированный механизм описания формул и выражений Expressions. Выражение представляется строкой, которая может быть разобрана, обработана и в результате можно будет получить некоторое вычисленное значение. В качестве языка для описания выражений используется язык критериев Criteria Operators. Написать строку формулу без ошибок не зная структуры объектов очень затруднительно, поэтому для конструирования выражений применяется штатный XAF дизайнер доступный в WinForms. Штатный редактор выражений встроен в дизайнер отчетов XtraReport, в редактор метамодели ModelEditor. Платформа Xafari расширяет возможности дизайнера выражений, а также делает возможность использования аналогичного дизайнера в Web интерфейсе. Дизайнер выражений Xafari аналогичен штатному, однако более функционален и удобен для использования в прикладных проектах. Дизайнер выражений Xafari доступен в Win и Web версиях. Использование в прикладных проектах дизайнера выражений Xafari ориентировано, как на администраторов системы, так и на бизнес пользователей, которые настраивают бизнес-правила обработки данных, например методисты.

Пример вычисляемого выражения для формирования расписания ВУЗа

Пример вычисляемого выражения для формирования расписания ВУЗа

Ключевые особенности редактора выражений Xafari:

  1. Доступность редактора для Win и Web версии XAF клиента
  2. Метаданные
    1. Иерархический просмотр и выбор полей и коллекций для типа
    2. Опциональное отображение локализованных названий полей и коллекций
  3. Проверка синтаксиса
    1. Проверка как всего выражения, так и выделенной его части текста
    2. Добавлена проверка на корректность наименований полей
    3. Добавлены сообщения об отсутствующих полях
    4. Расширены сообщения об ошибках синтаксиса
  4. Отладка и тестирование
    1. Отладка выражения с отображением результата расчета формулы
    2. Отладка как всего выражения, так и выделенной его части текста
  5. Просмотр документации для функций и полей сущностей
    1. Для полей объекта изменен формат описания, более полная информация
    2. Просмотр возможных значений для типов перечислений Enum
  6. Добавлены возможности расширения в прикладном проекте
    1. Изменение типа объекта (для выбора возможных полей)
    2. Добавление параметров
    3. Добавление констант
    4. Добавление функций

В отличии от дизайнера XtraReport, тут по умолчанию используются программные имена полей сущности, а не Заголовки (Caption), что устраняет проблемы с локализованных конфигураций. Для совместимости мы оставили возможность отображения локализованных названий полей (в штатном редакторе отображаются именно локализованные заголовки полей). Данные возможности позволяют бизнес-пользователям менять часть бизнес-логики прикладной системы без обращения к разработчикам и администраторам. Что существенно увеличивает применимость систем, а саму систему делает более робастной (устойчивой к изменению первоначальных требований).

Функционал редактора формул

Отображение поля типа «выражение»: слева кнопка «дизайнер»

Отображение поля типа «выражение»: слева кнопка «дизайнер»

Специально для того, чтобы можно было редактировать выражения в веб приложении для прикладного проекта разработан Property Editor, который повторяет и дополняет возможности штатного DevExpress. Для редактирования можно открыть дизайнер во всплывающем окне (при нажатии на кнопку «Открыть редактор выражений»).

Окно дизайнера выражений Xafari

Окно дизайнера выражений Xafari

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

  • в самом верху отображаются отладочные сообщения и сообщения об ошибке в формуле
  • текстовое поле для редактирования выражения, включая две кнопки:
    • «Проверить» – разбор и проверка корректности выражения
    • «Вычислить» – проверка расчета формулы для экземпляра объекта, результат будет показан в первой строке дизайнера
  • Ряд кнопок – типовые операции + - and or …
  • Метаданные – позволяет пользователю выбирать поля объекта и функции
  • Объект – выбор контекстного объекта из БД, над которым будет рассчитываться формула (это тот объект поля которого отображаются в области просмотра метаданных). Данный объект необходим для отладки формулы (нажатие на кнопку «Вычислить» в дизайнере). Доступны следующие действия:
    • Найти – открывает lookup форму для выбора объекта
    • Очистить – сбросить выбор объекта
    • Открыть текущий объект – открыть карточную форму объекта в режиме просмотра

В области просмотра метаданных сейчас доступно 5 категорий:

  1. Функции – базовые функции, включая зарегистрированные в проекте прикладные бизнес-операции. Функции можно фильтровать по видам «Все функции», «Агрегатные», «Математические», «Строковые», «Логические», «Дата» и «другие»
  2. Операторы - доступные операторы для выражений
  3. Поля – иерархическое дерево полей объекта, включая коллекции
  4. Константы – прикладной проект может определять ряд констант, доступных при описании выражения
  5. Параметры - прикладной проект может определять ряд констант, доступных при описании выражения

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

Использование в проекте

Для использования редактора необходимо для свойства типа string добавить два атрибута: 1) EditorAlias("ExpressionPropertyEditor") – указать редактор для поля string. 2) CriteriaOptions – в качестве параметра передать имя свойства, которое будет возвращать тип объекта, для которого будет строиться выражение (может быть пропущен, тогда редактор выражений не будет отображать дерево полей).

Для вычисления значения выражения необходимо использовать метод GetValue статического класса ExpressionCalculator:

Дополнительно

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

  1. Функции - доступно автоматически, функции зарегистрированные в проекте
  2. Операторы
  3. Поля – доступно автоматически, дерево полей объекта
  4. Константы – создать совой наследник формы и логики
  5. Сводные операции – операции, применяемые к коллекциям
  6. Другие категории – создать совой наследник формы и логики

Пример использования параметров в формуле

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

  • CollectParameters – собирает имена параметров и их описания
  • CollectParametersValues – сопоставляет имя параметра и его значение при отладке формулы

События добавлены в ExpressionPropertyEditor и ASPxExpressionPropertyEditor, которые являются наследниками интерфейса IExpressionEditor. Для вычисления значения выражения с использованием параметров необходимо передавать значения параметров, которые являются необязательным параметром у методов:

  • ExpressionCalculator.GetValue (string expression, object context, Dictionary<string, object> parameters = null)
  • ExpressionCalculator.GetValue (string expression, Dictionary<string, object> parameters = null)

Пример задания пользовательских параметров для редактора выражений разработан в ExpressionEditorParametersViewController в учебном проекте Xafari FeatureCenter:

Пример описания пользовательских функций

В данном примере используется пользовательская функция, которая прибавляет к первому числу второе. Для того, чтоб описать эту функцию для редактора выражений, необходимо описать класс, реализующий интерфейс ICustomFunctionOperatorBrowsable, и зарегистрировать эту функцию через статический метод CriteriaOperator.RegisterCustomFunction(...). Более подробное описание приведено в документации Devexpress Implementing Custom Functions: Пример описания функции:

Пример регистрации функции: