Miklix

Dynamics AX 2012 SysOperation Framework Hurtigt overblik

Udgivet: 15. februar 2025 kl. 22.33.04 UTC

Denne artikel giver et hurtigt overblik (eller snydeark) om, hvordan man implementerer behandlingsklasser og batchjobs i SysOperation-rammerne i Dynamics AX 2012 og Dynamics 365 for Operations.


Denne side er blevet maskinoversat fra engelsk for at gøre den tilgængelig for så mange mennesker som muligt. Desværre er maskinoversættelse endnu ikke en perfekt teknologi, så der kan forekomme fejl. Hvis du foretrækker det, kan du se den originale engelske version her:

Dynamics AX 2012 SysOperation Framework Quick Overview

Oplysningerne i dette indlæg er baseret på Dynamics AX 2012 R3. Det er muligvis ikke gyldigt for andre versioner. (Opdatering: Jeg kan bekræfte, at oplysningerne i denne artikel også er gyldige for Dynamics 365 for Operations)


Dette indlæg er kun ment som et hurtigt overblik og snydeark. Hvis du er ny i SysOperation-rammerne, anbefaler jeg kraftigt, at du også læser Microsofts hvidbog om emnet. Oplysningerne her kan være nyttige, hvis du blot har brug for en hurtig opfriskning af de forskellige klasser, der er involveret i udviklingen af ​​operationer med denne ramme.

Der er variationer, men når jeg bruger frameworket implementerer jeg typisk tre klasser:

  • Datakontrakt (skal forlænge SysOperationDataContractBase)
  • Service (skal udvide SysOperationServiceBase)
  • Controller ( skal udvide SysOperationServiceController)

Derudover kan jeg også implementere en UIBuilder-klasse ( skal udvide SysOperationUIBuilder), men det er kun nødvendigt, hvis dialogen af ​​en eller anden grund skal være mere avanceret end det, som rammen genererer automatisk.


Datakontrakt

Datakontrakten indeholder de datamedlemmer, der er nødvendige for din drift. Den kan sammenlignes med den typiske CurrentList-makro defineret i RunBase-frameworket, men implementeret som en klasse i stedet. Datakontrakten bør forlænge SysOperationDataContractBase, men vil fungere, selvom den ikke gør det. Fordelen ved at udvide superklassen er, at den giver nogle sessionsoplysninger, der kan være praktiske.

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

I dette eksempel er itemId et datamedlem. Du skal implementere en parm-metode for hvert datamedlem og tagge det med DataMemberAttribute, så frameworket ved, hvad det er. Dette gør det muligt for rammen automatisk at bygge dialogen for dig.

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

    itemId = _itemId;
    return itemId;
}


Service

Serviceklassen er den klasse, der indeholder den egentlige forretningslogik. Det handler ikke om at vise dialoger, batchbehandling eller noget lignende - det er controllerklassens ansvar. Ved at adskille dette er der større sandsynlighed for, at du designer din kode godt og laver mere genbrugelig kode.

Ligesom datakontraktklassen behøver serviceklassen ikke at arve fra noget bestemt, men den bør arve fra SysOperationServiceBase-klassen, i hvert fald hvis man forventer at servicen vil blive kørt som et batchjob, da superklassen giver en del information om batch-konteksten. Metoden, der starter operationen (dvs. kører forretningslogikken) skal tage et objekt fra din datakontraktklasse som input og skal være dekoreret med [SysEntryPointAttribute]. For eksempel:

class MyService extends SysOperationServiceBase
{
}

med en metode kaldet run:

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


Controller

Controllerklassen håndterer udførelsen og batchbehandlingen af ​​din operation. Det sørger også for, at koden udføres i CIL for maksimal ydeevne. Controllerklassen arver typisk fra SysOperationServiceController-klassen, selvom der også er andre muligheder.

class MyController extends SysOperationServiceController
{
}

Konstruktøren af ​​superklassen tager et klassenavn, metodenavn og (valgfrit) udførelsestilstand som parametre. Klasse- og metodenavnene skal være navnet på din serviceklasse og den metode, der skal køres på den. Så du kan implementere din controllers konstruktionsmetode som denne:

public static MyController construct()
{
    ;

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

Så kan hovedmetoden i MyController-klassen være så enkel som

public static void main(Args _args)
{
    ;

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

Og du er stort set færdig. Ovenstående er naturligvis et meget simpelt eksempel, og rammeværket rummer et væld af andre muligheder og muligheder, men dette fungerer som et hurtigt overblik, hvis du trænger til en opfriskning, når du ikke har brugt rammen i et stykke tid.

Del på BlueskyDel på FacebookDel på LinkedInDel på TumblrDel på XDel på LinkedInFastgør på Pinterest

Mikkel Bang Christensen

Om forfatteren

Mikkel Bang Christensen
Mikkel er skaberen og ejeren af miklix.com. Han har over 20 års erfaring som professionel computerprogrammør/softwareudvikler og er i øjeblikket fuldtidsansat i en stor europæisk IT-virksomhed. Når han ikke blogger, bruger han sin fritid på en lang række interesser, hobbyer og aktiviteter, som i et vist omfang afspejles i de mange forskellige emner, der dækkes på dette websted.