Miklix

Dynamics AX 2012 SysOperation Framework Rask oversikt

Publisert: 15. februar 2025 kl. 22:35:28 UTC
Sist oppdatert: 13. september 2025 kl. 22:52:55 UTC

Denne artikkelen gir en rask oversikt (eller jukseark) om hvordan du implementerer behandlingsklasser og satsvise jobber 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 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 på det sterkeste 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 er variasjoner, men når jeg bruker rammeverket implementerer jeg vanligvis tre klasser:

  • Datakontrakt (bør utvide SysOperationDataContractBase)
  • Service (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 operasjonen. Den kan sammenlignes med den typiske CurrentList-makroen som er definert i RunBase-rammeverket, men implementert som en klasse i stedet. Datakontrakten skal utvide SysOperationDataContractBase, men vil fungere selv om den ikke gjør det. Fordelen med å utvide superklassen er at den gir litt ø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 den med DataMemberAttribute slik at rammeverket vet hva det er. Dette gjør at rammeverket automatisk kan bygge dialogen for deg.

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

    itemId = _itemId;
    return itemId;
}


Tjeneste

Serviceklassen er klassen som inneholder den faktiske forretningslogikken. Det er ikke opptatt av å vise dialoger, batchbehandling eller noe slikt – det er kontrollerklassens ansvar. Ved å skille dette er det mer sannsynlig at du utformer koden din godt og lager mer gjenbrukbar kode.

I likhet med datakontraktklassen trenger ikke tjenesteklassen å arve fra noe spesielt, men den bør arve fra SysOperationServiceBase-klassen, i det minste hvis du forventer at tjenesten skal kjøres som en satsvis jobb, siden superklassen gir litt informasjon om den satsvise konteksten. Metoden som starter operasjonen (dvs. kjører forretningslogikken) må ta et objekt fra datakontraktklassen som inndata og skal dekoreres med [SysEntryPointAttribute]. For eksempel:

class MyService extends SysOperationServiceBase
{
}

Med en metode som kalles Kjør:

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


Kontrolleren

Kontrollerklassen håndterer utførelse og batchbehandling av operasjonen din. Det 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 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 utgangspunktet 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 oppfriskning når du ikke har brukt rammeverket på en stund.

Videre lesing

Hvis du likte dette innlegget, kan du også like disse forslagene:


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

Mikkel Christensen

Om forfatteren

Mikkel 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.