Miklix

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

Публикувано: 15 февруари 2025 г. в 22:33:03 ч. 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 години опит като професионален компютърен програмист/разработчик на софтуер и в момента работи на пълен работен ден в голяма европейска ИТ корпорация. Когато не пише в блога, той прекарва свободното си време в широк спектър от интереси, хобита и дейности, които до известна степен могат да бъдат отразени в разнообразието от теми, обхванати в този уебсайт.