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-корпорации. Когда он не ведет блог, то тратит свое свободное время на огромное количество интересов, хобби и занятий, что в некоторой степени отражается в разнообразии тем, освещаемых на этом сайте.