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

Објавено: 5 март 2025, во 19:53:46 UTC
Последно ажурирано: 12 јануари 2026, во 08:40:33 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, барем ако очекувате дека услугата ќе се извршува како batch job, бидејќи супер класата обезбедува некои информации за batch контекстот. Методот што ја започнува операцијата (т.е. ја извршува деловната логика) мора да земе објект од вашата класа договор за податоци како влез и треба да биде украсен со [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Споделете на ФејсбукСподелете на LinkedInСподелете на TumblrСподелете на XЗакачи на PinterestСподелете на Reddit

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

За авторот

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