Краткий обзор Dynamics AX 2012 SysOperation Framework
Опубликовано: 15 февраля 2025 г. в 22:35:39 UTC
В этой статье представлен краткий обзор (или шпаргалка) по реализации классов обработки и пакетных заданий в фреймворке SysOperation в Dynamics AX 2012 и Dynamics 365 for Operations.
Dynamics AX 2012 SysOperation Framework Quick Overview
Информация в этом посте основана на Dynamics AX 2012 R3. Она может быть верна или нет для других версий. (Обновление: я могу подтвердить, что информация в этой статье также верна для Dynamics 365 for Operations)
Этот пост задуман как краткий обзор и шпаргалка. Если вы новичок в фреймворке SysOperation, я настоятельно рекомендую вам также прочитать white paper Microsoft по этой теме. Информация здесь может быть полезна, если вам просто нужно быстро освежить в памяти различные классы, задействованные в разработке операций с помощью этого фреймворка.
Существуют вариации, но при использовании фреймворка я обычно реализую три класса:
- Контракт данных (должен расширять SysOperationDataContractBase)
- Служба (должна расширять SysOperationServiceBase)
- Контроллер ( должен расширять SysOperationServiceController)
Кроме того, я также могу реализовать класс UIBuilder ( должен расширять SysOperationUIBuilder), но это необходимо только в том случае, если диалог по какой-то причине должен быть более сложным, чем тот, который фреймворк генерирует автоматически.
Контракт на данные
Контракт данных содержит элементы данных, необходимые для вашей операции. Его можно сравнить с типичным макросом CurrentList, определенным в фреймворке RunBase, но реализованным как класс. Контракт данных должен расширять SysOperationDataContractBase, но будет работать, даже если не расширяет. Преимущество расширения суперкласса в том, что он предоставляет некоторую информацию о сеансе, которая может быть полезна.
class MyDataContract extends SysOperationDataContractBase
{
ItemId itemId;
}
В этом примере itemId является членом данных. Вам необходимо реализовать метод parm для каждого члена данных и пометить его атрибутом DataMemberAttribute, чтобы фреймворк знал, что это такое. Это позволяет фреймворку автоматически построить диалог для вас.
public ItemId parmItemId(ItemId _itemId = itemId)
{
;
itemId = _itemId;
return itemId;
}
Услуга
Класс сервиса — это класс, который содержит фактическую бизнес-логику. Он не занимается отображением диалогов, пакетной обработкой или чем-то подобным — это ответственность класса контроллера. Разделив это, вы с большей вероятностью хорошо спроектируете свой код и сделаете его более пригодным для повторного использования.
Как и класс контракта данных, класс сервиса не должен наследовать от чего-либо в частности, но он должен наследовать от класса SysOperationServiceBase, по крайней мере, если вы ожидаете, что сервис будет запущен как пакетное задание, поскольку суперкласс предоставляет некоторую информацию о пакетном контексте. Метод, который запускает операцию (т. е. запускает бизнес-логику), должен принимать объект вашего класса контракта данных в качестве входных данных и должен быть декорирован [SysEntryPointAttribute]. Например:
{
}
с помощью метода, называемого run:
public void run(MyDataContract _dataContract)
{
// run business logic here
}
Контроллер
Класс контроллера управляет выполнением и пакетной обработкой вашей операции. Он также обеспечивает выполнение кода в CIL для максимальной производительности. Класс контроллера обычно наследуется от класса SysOperationServiceController, хотя есть и другие варианты.
{
}
Конструктор суперкласса принимает имя класса, имя метода и (необязательно) режим выполнения в качестве параметров. Имена класса и метода должны быть именем вашего класса службы и метода, который должен быть запущен на нем. Таким образом, вы можете реализовать метод построения вашего контроллера следующим образом:
{
;
return new MyController(classStr(MyService),
methodStr(MyService, run));
}
Тогда основной метод класса MyController может быть таким простым, как
{
;
MyController::construct().startOperation();
}
И вы в основном закончили. Вышеприведенный пример, очевидно, очень простой, и фреймворк содержит множество других опций и возможностей, но это служит в качестве быстрого обзора, если вам нужно освежить знания, когда вы некоторое время не использовали фреймворк.