Miklix

Краткий обзор 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, но будет работать, даже если не расширяет. Преимущество расширения суперкласса в том, что он предоставляет некоторую информацию о сеансе, которая может быть полезна.

[DataContractAttribute]
class MyDataContract extends SysOperationDataContractBase
{
    ItemId itemId;
}

В этом примере itemId является членом данных. Вам необходимо реализовать метод parm для каждого члена данных и пометить его атрибутом DataMemberAttribute, чтобы фреймворк знал, что это такое. Это позволяет фреймворку автоматически построить диалог для вас.

[DataMemberAttribute]
public ItemId parmItemId(ItemId _itemId = itemId)
{
    ;

    itemId = _itemId;
    return itemId;
}


Услуга

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

Как и класс контракта данных, класс сервиса не должен наследовать от чего-либо в частности, но он должен наследовать от класса SysOperationServiceBase, по крайней мере, если вы ожидаете, что сервис будет запущен как пакетное задание, поскольку суперкласс предоставляет некоторую информацию о пакетном контексте. Метод, который запускает операцию (т. е. запускает бизнес-логику), должен принимать объект вашего класса контракта данных в качестве входных данных и должен быть декорирован [SysEntryPointAttribute]. Например:

class MyService extends SysOperationServiceBase
{
}

с помощью метода, называемого run:

[SysEntryPointAttribute]
public void run(MyDataContract _dataContract)
{
    // run business logic here
}


Контроллер

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

class MyController extends SysOperationServiceController
{
}

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

public static MyController construct()
{
    ;

    return new MyController(classStr(MyService),
    methodStr(MyService, run));
}

Тогда основной метод класса MyController может быть таким простым, как

public static void main(Args _args)
{
    ;

    MyController::construct().startOperation();
}

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

Поделиться на BlueskyПоделиться на FacebookПоделиться на LinkedInПоделиться на TumblrПоделиться на XПоделиться на LinkedInЗакрепить на Pinterest

Миккель Банг Кристенсен

Об авторе

Миккель Банг Кристенсен
Миккель - создатель и владелец сайта miklix.com. Он имеет более чем 20-летний опыт работы в качестве профессионального программиста/разработчика программного обеспечения и в настоящее время работает на полную ставку в крупной европейской IT-корпорации. Когда он не ведет блог, то тратит свое свободное время на огромное количество интересов, хобби и занятий, что в некоторой степени отражается в разнообразии тем, освещаемых на этом сайте.