Miklix

Короткий огляд Dynamics AX 2012 SysOperation Framework

Опубліковано: 15 лютого 2025 р. о 22:35:47 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, я настійно рекомендую вам також прочитати білу книгу Microsoft на цю тему. Інформація тут може бути корисною, якщо вам просто потрібно швидко освіжити в пам'яті різні класи, що беруть участь у розробці операцій з цим фреймворком.

Є варіації, але коли я використовую фреймворк, я зазвичай реалізую три класи:

  • Контракт на обробку даних (має розширити SysOperationDataContractBase)
  • Service (має розширювати 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;
}


Служба

Клас service – це клас, який містить фактичну бізнес-логіку. Він не займається показом діалогових вікон, пакетною обробкою або чимось подібним – це відповідальність класу контролера. Відокремивши це, ви, швидше за все, добре розробите свій код і зробите більш придатним для повторного використання код.

Як і клас контракту даних, клас service не повинен успадковуватися від чогось конкретного, але він повинен успадковуватися від класу 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 років досвіду роботи професійним програмістом/розробником програмного забезпечення і наразі працює на повну ставку у великій європейській ІТ-корпорації. У вільний від ведення блогу час він присвячує різноманітним інтересам, хобі та захопленням, що певною мірою відображається на різноманітності тем, які висвітлюються на цьому сайті.