Miklix

Dynamics AX 2012 SysOperation Framework Rask oversikt

Publisert: 15. februar 2025 kl. 22:35:28 UTC

Denne artikkelen gir en rask oversikt (eller jukseark) om hvordan du implementerer behandlingsklasser og batchjobber i SysOperation-rammeverket i Dynamics AX 2012 og Dynamics 365 for Operations.


Denne siden er maskinoversatt fra engelsk for å gjøre den tilgjengelig for så mange som mulig. Dessverre er maskinoversettelse ennå ikke en fullkommen teknologi, så det kan forekomme feil. Hvis du foretrekker det, kan du se den engelske originalversjonen her:

Dynamics AX 2012 SysOperation Framework Quick Overview

Informasjonen i dette innlegget er basert på Dynamics AX 2012 R3. Det kan være eller ikke være gyldig for andre versjoner. (Oppdatering: Jeg kan bekrefte at informasjonen i denne artikkelen også er gyldig for Dynamics 365 for Operations)


Dette innlegget er bare ment som en rask oversikt og jukseark. Hvis du er ny på SysOperation-rammeverket, anbefaler jeg sterkt at du leser Microsofts hvitbok om emnet også. Informasjonen her kan være nyttig hvis du bare trenger en rask oppfriskning av de forskjellige klassene som er involvert i å utvikle operasjoner med dette rammeverket.

Det finnes variasjoner, men når jeg bruker rammeverket implementerer jeg vanligvis tre klasser:

  • Datakontrakt (bør forlenge SysOperationDataContractBase)
  • Tjenesten (bør utvide SysOperationServiceBase)
  • Kontroller ( utvide SysOperationServiceController)

I tillegg kan jeg også implementere en UIBuilder-klasse ( utvide SysOperationUIBuilder), men det er bare nødvendig hvis dialogen av en eller annen grunn må være mer avansert enn det rammeverket genererer automatisk.


Datakontrakt

Datakontrakten inneholder datamedlemmene som trengs for driften din. Den kan sammenlignes med den typiske CurrentList-makroen som er definert i RunBase-rammeverket, men implementert som en klasse i stedet. Datakontrakten bør utvide SysOperationDataContractBase, men vil fungere selv om den ikke gjør det. Fordelen med å utvide superklassen er at den gir noe øktinformasjon som kan være nyttig.

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

I dette eksemplet er itemId et datamedlem. Du må implementere en parm-metode for hvert datamedlem og merke det med DataMemberAttribute slik at rammeverket vet hva det er. Dette gjør det mulig for rammeverket å automatisk bygge dialogen for deg.

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

    itemId = _itemId;
    return itemId;
}


Service

Tjenesteklassen er klassen som inneholder selve forretningslogikken. Det er ikke opptatt av å vise dialoger, batchbehandling eller noe lignende – det er kontrollklassens ansvar. Ved å skille dette er det mer sannsynlig at du designer koden din godt og lager mer gjenbrukbar kode.

I likhet med datakontraktsklassen trenger ikke serviceklassen å arve fra noe spesielt, men den bør arve fra SysOperationServiceBase-klassen, i alle fall hvis du forventer at tjenesten skal kjøres som en batch-jobb, da superklassen gir en del informasjon om batch-konteksten. Metoden som starter operasjonen (dvs. kjører forretningslogikken) må ta et objekt av datakontraktklassen som input og skal være dekorert med [SysEntryPointAttribute]. For eksempel:

class MyService extends SysOperationServiceBase
{
}

med en metode kalt run:

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


Kontroller

Kontrollerklassen håndterer utførelse og batchbehandling av operasjonen din. Den sørger også for at koden kjøres i CIL for maksimal ytelse. Kontrollerklassen arver vanligvis fra SysOperationServiceController-klassen, selv om det også finnes andre alternativer.

class MyController extends SysOperationServiceController
{
}

Konstruktøren av superklassen tar et klassenavn, metodenavn og (valgfritt) utførelsesmodus som parametere. Klasse- og metodenavnene skal være navnet på tjenesteklassen din og metoden som skal kjøres på den. Så du kan implementere kontrollerens konstruksjonsmetode slik:

public static MyController construct()
{
    ;

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

Da kan hovedmetoden til MyController-klassen være så enkel som

public static void main(Args _args)
{
    ;

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

Og du er i grunnen ferdig. Ovennevnte er åpenbart et veldig enkelt eksempel og rammeverket inneholder en mengde andre alternativer og muligheter, men dette fungerer som en rask oversikt hvis du trenger en pensel opp når du ikke har brukt rammeverket på en stund.

Del på BlueskyDel på FacebookDel på LinkedInDel på TumblrDel på XDel på LinkedInFest på Pinterest

Mikkel Bang Christensen

Om forfatteren

Mikkel Bang Christensen
Mikkel er skaperen og eieren av miklix.com. Han har over 20 års erfaring som profesjonell dataprogrammerer/programvareutvikler og er for tiden ansatt på fulltid i et stort europeisk IT-selskap. Når han ikke blogger, bruker han fritiden sin på en lang rekke interesser, hobbyer og aktiviteter, noe som til en viss grad kan gjenspeiles i de mange ulike temaene som dekkes på dette nettstedet.