Miklix

Dynamics AX 2012 SysOperation Framework Prezentare generală rapidă

Publicat: 15 februarie 2025 la 22:35:37 UTC

Acest articol oferă o privire de ansamblu rapidă (sau o foaie de cheat) despre cum să implementați clasele de procesare și joburile batch în cadrul SysOperation în Dynamics AX 2012 și Dynamics 365 for Operations.


Această pagină a fost tradusă automat din limba engleză pentru a o face accesibilă cât mai multor persoane. Din păcate, traducerea automată nu este încă o tehnologie perfecționată, astfel încât pot apărea erori. Dacă preferați, puteți vizualiza versiunea originală în limba engleză aici:

Dynamics AX 2012 SysOperation Framework Quick Overview

Informațiile din această postare se bazează pe Dynamics AX 2012 R3. Poate fi valabil sau nu pentru alte versiuni. (Actualizare: pot confirma că informațiile din acest articol sunt valabile și pentru Dynamics 365 for Operations)


Această postare este menită doar ca o prezentare generală rapidă și o foaie de cheat. Dacă sunteți nou în cadrul SysOperation, vă sugerez să citiți și cartea albă a Microsoft despre acest subiect. Informațiile de aici pot fi utile dacă aveți nevoie doar de o periere rapidă a diferitelor clase implicate în dezvoltarea operațiunilor cu acest cadru.

Există variații, dar când folosesc cadrul, de obicei implementez trei clase:

  • Contract de date (ar trebui să extindă SysOperationDataContractBase)
  • Serviciu (ar trebui să extindă SysOperationServiceBase)
  • Controller ( trebuie să extindă SysOperationServiceController)

În plus, pot implementa și o clasă UIBuilder ( trebuie să extindă SysOperationUIBuilder), dar acest lucru este necesar doar dacă dialogul, dintr-un motiv oarecare, trebuie să fie mai avansat decât ceea ce generează automat cadrul.


Contract de date

Contractul de date conține membrii de date necesari pentru operațiunea dumneavoastră. Poate fi comparat cu macro-ul tipic CurrentList definit în cadrul RunBase, dar implementat ca o clasă. Contractul de date ar trebui să extindă SysOperationDataContractBase, dar va funcționa chiar dacă nu. Avantajul extinderii super-clasei este că oferă unele informații despre sesiune care pot fi la îndemână.

[DataContractAttribute]
class MyDataContract extends SysOperationDataContractBase
{
    ItemId itemId;
}

În acest exemplu, itemId este un membru al datelor. Trebuie să implementați o metodă parm pentru fiecare membru de date și să o etichetați cu DataMemberAttribute, astfel încât cadrul să știe ce este. Acest lucru permite cadrului să creeze automat dialogul pentru dvs.

[DataMemberAttribute]
public ItemId parmItemId(ItemId _itemId = itemId)
{
    ;

    itemId = _itemId;
    return itemId;
}


Serviciu

Clasa de servicii este clasa care conține logica de afaceri reală. Nu este preocupat de afișarea dialogurilor, procesarea în loturi sau ceva de genul - aceasta este responsabilitatea clasei de controler. Separând acest lucru, este mai probabil să vă proiectați bine codul și să faceți un cod mai reutilizabil.

Ca și clasa contractului de date, clasa de servicii nu trebuie să moștenească de la nimic anume, dar ar trebui să moștenească din clasa SysOperationServiceBase, cel puțin dacă vă așteptați ca serviciul să fie rulat ca un job batch, deoarece superclasa oferă câteva informații despre contextul lotului. Metoda care pornește operațiunea (adică rulează logica de afaceri) trebuie să ia ca intrare un obiect din clasa dvs. de contract de date și ar trebui să fie decorată cu [SysEntryPointAttribute]. De exemplu:

class MyService extends SysOperationServiceBase
{
}

cu o metodă numită run:

[SysEntryPointAttribute]
public void run(MyDataContract _dataContract)
{
    // run business logic here
}


Controlor

Clasa de controler se ocupă de execuția și procesarea în lot a operațiunii dumneavoastră. De asemenea, se asigură că codul este executat în CIL pentru performanță maximă. Clasa controlerului moștenește de obicei din clasa SysOperationServiceController, deși există și alte opțiuni.

class MyController extends SysOperationServiceController
{
}

Constructorul superclasei ia ca parametri un nume de clasă, un nume de metodă și (opțional) un mod de execuție. Numele clasei și metodei ar trebui să fie numele clasei dvs. de servicii și metoda care ar trebui să fie rulată pe ea. Deci, ați putea implementa metoda de construcție a controlerului dvs. astfel:

public static MyController construct()
{
    ;

    return new MyController(classStr(MyService),
    methodStr(MyService, run));
}

Atunci metoda principală a clasei MyController poate fi la fel de simplă ca

public static void main(Args _args)
{
    ;

    MyController::construct().startOperation();
}

Și practic ai terminat. Cele de mai sus sunt, evident, un exemplu foarte simplu, iar cadrul conține o multitudine de alte opțiuni și posibilități, dar aceasta servește ca o privire de ansamblu rapidă dacă aveți nevoie de o periere când nu ați folosit cadrul de ceva timp.

Distribuie pe BlueskyDistribuie pe FacebookDistribuie pe LinkedInDistribuie pe TumblrDistribuie pe XDistribuie pe LinkedInPin pe Pinterest

Mikkel Bang Christensen

Despre autor

Mikkel Bang Christensen
Mikkel este creatorul și proprietarul miklix.com. El are peste 20 de ani de experiență ca programator de calculatoare/dezvoltator software profesionist și este în prezent angajat cu normă întreagă pentru o mare corporație europeană de IT. Atunci când nu scrie pe blog, își petrece timpul liber cu o gamă largă de interese, hobby-uri și activități, care se pot reflecta într-o anumită măsură în varietatea de subiecte abordate pe acest site.