Command
Шаблон кастомной команды
Шаблон описания кастомной команды на форме:
В атрибуте Type
указывается имя класса, описывающего кастомную команду, а в качестве значения атрибута Assembly
указывается имя сборки, в которой реализован этот класс.
Для удобства и разделения логики команды, исходный код кастомной команды можно разбить на два класса:
CustomCommandSettings- класс загрузки данных из xml-файла;
CustomCommand - класс с бизнес-логикой.
Парсинг xml
Полный код шаблона:
Конструктор класса принимает параметры:
parent
IDependable - ссылка на экземпляр класса CustomCommand, для которого создавался объект типа CustomCommandSettings;form
IWorkflowForm - форма, на которой описана кастомная команда;node
XmlNode - узел, который соответствует тэгу <Command>, описанному в xml-файле формы.dataBindingProvider
IDataBindingProvider -
Исполняемый код
Кастомную команду наследуем от класса AsyncCommand:
Результат команды
Результатом выполнения любой команды должен быть словарь параметров.
Если словарь содержит параметр с именем Value, то значение этого параметра можно получить, обратившись к команде по имени:
В противном случае значение параметра получаем по имени через атрибут Parameter
:
Элементы команды
Константы и переменные
Для задания констант используем значения атрибутов, а для задания переменных - значения тэгов. В примере рассмотрим xml-код команды с необязательным тэгом <Flag>
и обязательным тэгом <Something>
:
Парсинг xml
В конструкторе класса CustomCommandSettings необходимо прописать код вида:
Так как тэг <Flag>
является необязательным, то для получения его значения используется статический метод GetAttributeValue класса XmlParser. В третьем параметре (string path) указываем полный путь до тэга, значение атрибута которого нужно получить. Имя атрибута указывается в четвертом параметре (string attribute). Если тэг <Flag>
или его атрибут Value
будут отсутствовать в описании команды, то свойству Flag будет присвоено значение по умолчанию, переданное пятым параметром (T defaultValue).
Для работы с переменным значением, указанным в тэге <Something>
, используется механизм привязки данных, который позволяет в любой момент выполнения кастомной команды получать актуальное значение объекта с именем MyVariable.
Для получения привязки к источнику данных в тэге <Something>
используем статический метод GetRequiredElementDataBinding.
Исполняемая часть
В методе LoadSettings из объекта settings, переданного в метод в качестве параметра, можно получить нужные значения, обратившись к соответствующим публичным свойствам:
В методе ExecuteAsyncCommand работа с константными значениями простая:
А для получения значения из объекта типа IDataBinding необходимо использовать метод GetValue:
Полный список методов по ссылке.
Условие
В примере рассмотрим xml-код команды с обязательным тэгом <AnyCondition>
для передачи имени условия:
Парсинг xml
В конструкторе класса CustomCommandSettings необходимо прописать код вида:
Так как имя условия указывается в качестве значения атрибута обязательного тэга, то для его получения используется статический метод GetRequiredAttributeValue класса XmlParser. В третьем параметре (string path) указываем полный путь до тэга, значение атрибута которого нужно получить. Имя атрибута указывается в четвертом параметре (string attribute). В данном случае используется константа NAME_ATTRIBUTE
, описанная в базовом классе. Если элемент или его атрибут отсутствует, будет возвращено исключение типа InvalidXmlException.
Если необходимо получить значение необязательного атрибута, то следует использовать метод GetAttributeValue. Этот метод в случае отсутствия элемента или его атрибута будет возвращать значение по умолчанию, переданное в параметрах метода.
Имея имя условия, объект типа ICondition можно получить через переменную form типа IWorkflowForm, используя метод GetCondition.
Исполняемая часть
В методе LoadSettings из объекта settings, переданного в метод в качестве параметра, можно получить объект типа ICondition, обратившись к публичному свойству AnyCondition:
В методе ExecuteAsyncCommand можно получать значение условия, обращаясь к свойству Value:
Параметры
Парсинг xml
В конструкторе класса CustomCommandSettings необходимо прописать код вида:
Исполняемая часть
В методе LoadSettings из объекта settings, переданного в метод в качестве параметра, можно получить словарь параметров:
В методе ExecuteAsyncCommand можно получать значение параметров через метод GetValue, так как каждый параметр представлен объектом типа IDataBinding:
SQL-запросы
Если команда должна отправлять на сервер запрос на выполнение SqlQuery, то всегда должно указываться имя процесса (WorkflowName), в рамках которого описан SQL-запрос. Аналогичный тэг указывается в описании PrimaryGetDataConnection.
Парсинг xml
В конструкторе класса CustomCommandSettings необходимо прописать код вида:
Так как имя процесса и запрос являются обязательными для описания в команде, то для получения их значений используется статический метод GetRequiredAttributeValue класса XmlParser. В третьем параметре (string path) указываем полный путь до тэга, значение атрибута которого нужно получить. Имя атрибута указывается в четвертом параметре (string attribute). В данном случае используется константа NAME_ATTRIBUTE
, описанная в базовом классе. Если элемент или его атрибут отсутствует, будет возвращено исключение типа InvalidXmlException.
Исполняемая часть
В методе LoadSettings из объекта settings, переданного в метод в качестве параметра, можно получить имя процесса и имя SQL-запроса, который нужно выполнять:
В методе ExecuteAsyncCommand для выполнения запроса к серверной части, необходимо из объекта формы получить клиента серверной части (WorkflowEngineClient). В метод ExecuteQuery клиента необходимо передать имя процесса, имя SQL-запроса (описанного в серверном xml-файле) и словарь параметров, значения которых должны подставляться в текст запроса:
Результатом выполнения метода ExecuteQuery будет таблица типа DataTable, дальнейшая работа с которой может быть с помощью LINQ, либо путем перебора всех строк:
Команды
Парсинг xml
В конструкторе класса CustomCommandSettings необходимо прописать код вида:
Для получения имени команды используется статический метод GetRequiredAttributeValue класса XmlParser. В третьем параметре (string path) указываем полный путь до тэга, значение атрибута которого нужно получить. Имя атрибута указывается в четвертом параметре (string attribute). В данном случае используется константа NAME_ATTRIBUTE
, описанная в базовом классе. Если элемент или его атрибут отсутствует, будет возвращено исключение типа InvalidXmlException.
Если необходимо получить значение необязательного атрибута, то следует использовать метод GetAttributeValue. Этот метод в случае отсутствия элемента или его атрибута будет возвращать значение по умолчанию, переданное в параметрах метода.
Имея имя команды, объект типа ICommand можно получить через переменную form типа IWorkflowForm, используя метод GetCommand.
Исполняемая часть
В методе LoadSettings из объекта settings, переданного в метод в качестве параметра, можно получить объект типа ICommand, обратившись к публичному свойству AnyCommand:
В методе ExecuteAsyncCommand у объекта типа ICommand можно вызвать метод Execute, который запустит процесс выполнения команды:
В метод Execute можно передать словарь параметров, если команда использует входные параметры.
Получить результат выполнения команды:
Таблица
Парсинг xml
В конструкторе класса CustomCommandSettings необходимо прописать код вида:
Исполняемая часть
В методе LoadSettings из объекта settings, переданного в метод в качестве параметра, можно получить объект типа DatabaseTable, обратившись к публичному свойству AnyDatabaseTable:
В методе ExecuteAsyncCommand у любого объекта можно вызывать метод GetProperty для обращения к get-проперти, реализованному у объекта. Например, можно обратиться к get-проперти Column у объекта DatabaseTable:
Первым аргументом идет имя get-проперти, а затем словарь параметров, которые принимает проперти объекта.
Так же можно вызывать метод SetProperty, чтобы обращаться к set-проперти объекта.
Логирование
Для добавления записей в журнал событий Windows используется класс Logger со статическим методом Write.
Пример добавления сообщения уровня Error в методе ExecuteAsyncCommand:
Обычно используются уровни событий: Error, Warning, Information.
Пример добавления сообщения уровня Information в конструкторе CustomCommandSettings при парсинге xml-кода команды:
Last updated