Miklix

Бърз преглед на Dynamics AX 2012 SysOperation Framework

Публикувано: 15 февруари 2025 г. в 22:33:03 ч. UTC
Последна актуализация: 12 януари 2026 г. в 8:38:44 ч. 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)
  • Услуга (трябва да разшири 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Закачи в Пинтерест

Микел Кристенсен

За автора

Микел Кристенсен
Микел е създател и собственик на сайта miklix.com. Той има над 20 години опит като професионален компютърен програмист/разработчик на софтуер и в момента работи на пълен работен ден в голяма европейска ИТ корпорация. Когато не пише в блога, той прекарва свободното си време в широк спектър от интереси, хобита и дейности, които до известна степен могат да бъдат отразени в разнообразието от теми, обхванати в този уебсайт.