Dynamics AX 2012 SysOperation Framework Snel overzicht
Gepubliceerd: 15 februari 2025 om 22:35:29 UTC
Dit artikel biedt een snel overzicht (of spiekbriefje) van het implementeren van verwerkingsklassen en batchtaken in het SysOperation-framework in Dynamics AX 2012 en Dynamics 365 for Operations.
Dynamics AX 2012 SysOperation Framework Quick Overview
De informatie in dit bericht is gebaseerd op Dynamics AX 2012 R3. Het kan wel of niet geldig zijn voor andere versies. (Update: Ik kan bevestigen dat de informatie in dit artikel ook geldig is voor Dynamics 365 for Operations)
Deze post is alleen bedoeld als een snel overzicht en een cheat sheet. Als u nieuw bent in 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 gewoon even snel wat kennis wilt opdoen over 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:
- Datacontract (moet SysOperationDataContractBase uitbreiden)
- Service (moet SysOperationServiceBase uitbreiden)
- Controller ( moet SysOperationServiceController uitbreiden)
Daarnaast kan ik ook een UIBuilder-klasse implementeren ( ik moet SysOperationUIBuilder uitbreiden), maar dat is alleen nodig als de dialoog om 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 in plaats daarvan als een klasse is geïmplementeerd. Het datacontract zou SysOperationDataContractBase moeten uitbreiden, maar zal ook werken als dat niet het geval is. Het voordeel van het uitbreiden van de superklasse is dat het wat sessie-informatie biedt die handig kan zijn.
class MyDataContract extends SysOperationDataContractBase
{
ItemId itemId;
}
In dit voorbeeld is de itemId een datalid. U moet een parm-methode implementeren voor elk datalid en deze taggen met de DataMemberAttribute, zodat het framework weet wat het is. Dit stelt het framework in staat om de dialoog automatisch voor u te bouwen.
public ItemId parmItemId(ItemId _itemId = itemId)
{
;
itemId = _itemId;
return itemId;
}
Dienst
De serviceklasse is de klasse die de daadwerkelijke bedrijfslogica bevat. Het houdt zich niet bezig met het weergeven van dialogen, batchverwerking of iets dergelijks – dat is de verantwoordelijkheid van de controllerklasse. Door dit te scheiden, is de kans groter dat u uw code goed ontwerpt en meer herbruikbare code maakt.
Net als de data contract class hoeft de service class niet van iets specifieks te erven, maar moet deze wel van de SysOperationServiceBase class erven, tenminste als u verwacht dat de service als batch job wordt uitgevoerd, aangezien de super class wat informatie over de batch context verschaft. De methode die de operatie start (d.w.z. de business logic uitvoert) moet een object van uw data contract class als input nemen en moet worden gedecoreerd met de [SysEntryPointAttribute]. Bijvoorbeeld:
{
}
met een methode genaamd run:
public void run(MyDataContract _dataContract)
{
// run business logic here
}
Beheerder
De controllerklasse behandelt de uitvoering en batchverwerking van uw bewerking. Het zorgt er ook voor dat de code wordt uitgevoerd in CIL voor maximale prestaties. De controllerklasse erft doorgaans van de SysOperationServiceController-klasse, hoewel er ook andere opties zijn.
{
}
De constructor van de superklasse neemt een klassenaam, methodenaam en (optioneel) uitvoeringsmodus als parameters. De klasse- en methodenamen moeten de naam zijn van uw serviceklasse en de methode die erop moet worden uitgevoerd. U kunt de constructmethode van uw controller dus als volgt implementeren:
{
;
return new MyController(classStr(MyService),
methodStr(MyService, run));
}
Dan kan de hoofdmethode van de MyController-klasse zo eenvoudig zijn als
{
;
MyController::construct().startOperation();
}
En je bent in principe klaar. Het bovenstaande is uiteraard een heel eenvoudig voorbeeld en het framework bevat een overvloed aan andere opties en mogelijkheden, maar dit dient als een snel overzicht als je een opfriscursus nodig hebt als je het framework een tijdje niet hebt gebruikt.