Miklix

Dynamics AX 2012 SysOperation Framework Snel overzicht

Gepubliceerd: 15 februari 2025 om 22:35:29 UTC
Laatst bijgewerkt: 12 januari 2026 om 08:38:56 UTC

Dit artikel biedt een snel overzicht (of beknopte handleiding) van hoe u verwerkingsklassen en batchtaken implementeert in het SysOperation-framework in Dynamics AX 2012 en Dynamics 365 for Operations.


Deze pagina is machinaal uit het Engels vertaald om hem voor zoveel mogelijk mensen toegankelijk te maken. Helaas is machinevertaling nog geen geperfectioneerde technologie, dus er kunnen fouten optreden. Als je dat liever hebt, kun je hier de originele Engelse versie bekijken:

Dynamics AX 2012 SysOperation Framework Quick Overview

De informatie in dit bericht is gebaseerd op Dynamics AX 2012 R3. Deze informatie is mogelijk niet geldig voor andere versies. (Update: Ik kan bevestigen dat de informatie in dit artikel ook geldig is voor Dynamics 365 for Operations.)


Dit bericht is slechts bedoeld als een snel overzicht en spiekbriefje. Als u nog niet bekend bent met het SysOperation-framework, raad ik u ten zeerste aan om ook de whitepaper van Microsoft over dit onderwerp te lezen. De informatie hier kan nuttig zijn als u alleen een snelle opfrissing nodig hebt van de verschillende klassen die betrokken zijn bij het ontwikkelen van bewerkingen met dit framework.

Er zijn variaties, maar wanneer ik het framework gebruik, implementeer ik doorgaans drie klassen:

  • Gegevenscontract (moet SysOperationDataContractBase uitbreiden)
  • Service (moet SysOperationServiceBase uitbreiden)
  • Controller (moet SysOperationServiceController uitbreiden)

Daarnaast kan ik ook een UIBuilder-klasse implementeren (die SysOperationUIBuilder moet uitbreiden), maar dat is alleen nodig als het dialoogvenster om de een of andere reden geavanceerder moet zijn dan wat het framework automatisch genereert.


Gegevenscontract

Het datacontract bevat de dataleden die nodig zijn voor uw bewerking. Het kan worden vergeleken met de typische CurrentList-macro die is gedefinieerd in het RunBase-framework, maar dan geïmplementeerd als een klasse. Het datacontract moet SysOperationDataContractBase uitbreiden, maar werkt ook als dat niet het geval is. Het voordeel van het uitbreiden van de superklasse is dat het bepaalde sessie-informatie bevat die nuttig kan zijn.

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

In dit voorbeeld is `itemId` een datalidd. Je moet voor elk datalidd een `parm`-methode implementeren en deze voorzien van het `DataMemberAttribute`, zodat het framework weet wat het is. Hierdoor kan het framework automatisch het dialoogvenster voor je genereren.

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

    itemId = _itemId;
    return itemId;
}


Dienst

De serviceklasse is de klasse die de daadwerkelijke bedrijfslogica bevat. Deze klasse houdt zich niet bezig met het weergeven van dialoogvensters, batchverwerking of iets dergelijks – dat is de verantwoordelijkheid van de controllerklasse. Door dit te scheiden, is de kans groter dat je je code beter ontwerpt en dat je code herbruikbaarder maakt.

Net als de data contract-klasse hoeft de serviceklasse niet van iets specifieks te erven, maar het is wel aan te raden om van de SysOperationServiceBase-klasse te erven, tenminste als u verwacht dat de service als batchtaak wordt uitgevoerd, aangezien de superklasse informatie over de batchcontext biedt. De methode die de bewerking start (d.w.z. de bedrijfslogica uitvoert) moet een object van uw data contract-klasse als invoer accepteren en moet worden voorzien van het [SysEntryPointAttribute]. Bijvoorbeeld:

class MyService extends SysOperationServiceBase
{
}

Met een methode genaamd run:

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


Controller

De controllerklasse verzorgt de uitvoering en batchverwerking van uw bewerking. Het zorgt er ook voor dat de code in CIL wordt uitgevoerd voor maximale prestaties. De controllerklasse erft doorgaans van de SysOperationServiceController-klasse, hoewel er ook andere opties zijn.

class MyController extends SysOperationServiceController
{
}

De constructor van de superklasse neemt een klassenaam, een methodenaam en (optioneel) de uitvoeringsmodus als parameters. De klasse- en methodenaam moeten de naam van je serviceklasse en de naam van de methode die erop moet worden uitgevoerd zijn. Je zou de constructor-methode van je controller bijvoorbeeld als volgt kunnen implementeren:

public static MyController construct()
{
    ;

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

De hoofdmethode van de klasse MyController kan dan heel eenvoudig zijn:

public static void main(Args _args)
{
    ;

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

En daarmee ben je in principe klaar. Bovenstaand is uiteraard een zeer eenvoudig voorbeeld en het framework bevat talloze andere opties en mogelijkheden, maar dit dient als een snel overzicht voor het geval je je geheugen wilt opfrissen wanneer je het framework een tijdje niet hebt gebruikt.

Verder lezen

Als je dit bericht leuk vond, vind je deze suggesties misschien ook interessant:


Delen op BlueskyDelen op FacebookDelen op LinkedInDelen op TumblrDelen op XDelen op LinkedInPin op Pinterest

Mikkel Christensen

Over de auteur

Mikkel Christensen
Mikkel is de bedenker en eigenaar van miklix.com. Hij heeft meer dan 20 jaar ervaring als professioneel computerprogrammeur/softwareontwikkelaar en werkt momenteel fulltime voor een groot Europees IT-bedrijf. Als hij niet blogt, besteedt hij zijn vrije tijd aan een breed scala aan interesses, hobby's en activiteiten, die tot op zekere hoogte weerspiegeld kunnen worden in de verscheidenheid aan onderwerpen op deze website.