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.
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.
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.
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:
{
}
med en metode kaldet run:
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.
{
}
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:
{
;
return new MyController(classStr(MyService),
methodStr(MyService, run));
}
Så kan hovedmetoden i MyController-klassen være så enkel som
{
;
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.