Rychlý přehled Dynamics AX 2012 SysOperation Framework

Vydáno: 15. února 2025 v 22:33:04 UTC
Poslední aktualizace: 12. ledna 2026 v 8:38:45 UTC

Tento článek poskytuje rychlý přehled (neboli tahák) o tom, jak implementovat třídy zpracování a dávkové úlohy v rámci SysOperation v aplikacích Dynamics AX 2012 a Dynamics 365 for Operations.


Tato stránka byla strojově přeložena z angličtiny, aby byla přístupná co největšímu počtu lidí. Strojový překlad bohužel ještě není dokonalá technologie, takže může dojít k chybám. Pokud si přejete, můžete si prohlédnout původní anglickou verzi zde:

Dynamics AX 2012 SysOperation Framework Quick Overview

Informace v tomto příspěvku jsou založeny na aplikaci Dynamics AX 2012 R3. Pro jiné verze mohou, ale nemusí být platné. (Aktualizace: Mohu potvrdit, že informace v tomto článku platí i pro Dynamics 365 for Operations.)


Tento příspěvek slouží pouze jako rychlý přehled a tahák. Pokud s frameworkem SysOperation teprve začínáte, důrazně doporučuji přečíst si také bílou knihu od Microsoftu na toto téma. Zde uvedené informace mohou být užitečné, pokud si potřebujete jen rychle osvěžit znalosti o různých třídách zapojených do vývoje operací s tímto frameworkem.

Existují různé varianty, ale když používám framework, obvykle implementuji tři třídy:

  • Datová smlouva (měla by rozšířit SysOperationDataContractBase)
  • Služba (měla by rozšířit SysOperationServiceBase)
  • Controller (musí rozšířit SysOperationServiceController)

Kromě toho mohu implementovat také třídu UIBuilder (musí rozšířit SysOperationUIBuilder), ale to je nutné pouze v případě, že dialog z nějakého důvodu musí být pokročilejší než to, co framework generuje automaticky.


Smlouva o datech

Datový kontrakt obsahuje datové členy potřebné pro vaši operaci. Lze jej porovnat s typickým makrem CurrentList definovaným v frameworku RunBase, ale implementovaný jako třída. Datový kontrakt by měl rozšiřovat SysOperationDataContractBase, ale bude fungovat i v případě, že ne. Výhodou rozšíření nadřazené třídy je, že poskytuje některé informace o relaci, které se mohou hodit.

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

V tomto příkladu je itemId datový člen. Pro každý datový člen je třeba implementovat metodu parm a označit jej atributem DataMemberAttribute, aby framework věděl, o jaký datový člen se jedná. To mu umožní automaticky vytvořit dialogové okno za vás.

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

    itemId = _itemId;
    return itemId;
}


Servis

Třída služeb je třída, která obsahuje samotnou obchodní logiku. Nezabývá se zobrazováním dialogů, dávkovým zpracováním ani ničím podobným – to je odpovědností třídy kontroleru. Oddělením této třídy je pravděpodobnější, že navrhnete svůj kód dobře a vytvoříte více opakovaně použitelného kódu.

Stejně jako třída datového kontraktu nemusí třída služby dědit od ničeho konkrétního, ale měla by dědit od třídy SysOperationServiceBase, alespoň pokud očekáváte, že služba bude spuštěna jako dávková úloha, protože nadřazená třída poskytuje některé informace o kontextu dávky. Metoda, která spouští operaci (tj. spouští obchodní logiku), musí jako vstup přijímat objekt vaší třídy datového kontraktu a měla by být dekorována atributem [SysEntryPointAttribute]. Například:

class MyService extends SysOperationServiceBase
{
}

S metodou nazvanou run:

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


Ovladač

Třída controlleru zajišťuje provádění a dávkové zpracování operací. Také zajišťuje, aby byl kód spuštěn v CIL pro maximální výkon. Třída controlleru obvykle dědí z třídy SysOperationServiceController, ačkoli existují i další možnosti.

class MyController extends SysOperationServiceController
{
}

Konstruktor nadřazené třídy bere jako parametry název třídy, název metody a (volitelné) režim provádění. Názvy tříd a metod by měly být názvem vaší servisní třídy a metody, která by na ní měla být spuštěna. Metodu konstrukce vašeho kontroleru byste tedy mohli implementovat takto:

public static MyController construct()
{
    ;

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

Pak hlavní metoda třídy MyController může být jednoduchá jako

public static void main(Args _args)
{
    ;

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

A v podstatě máte hotovo. Výše uvedený příklad je samozřejmě velmi jednoduchý a framework obsahuje nepřeberné množství dalších možností a možností, ale toto slouží jako rychlý přehled, pokud si potřebujete osvěžit znalosti, když jste framework nějakou dobu nepoužívali.

Další čtení

Pokud se vám tento příspěvek líbil, mohly by se vám líbit i tyto návrhy:


Sdílet na BlueskySdílejte na FacebookuSdílet na LinkedInSdílet na TumblrSdílet na XPřipnout na PinterestSdílejte na Redditu

Mikkel Christensen

O autorovi

Mikkel Christensen
Mikkel je tvůrcem a majitelem webu miklix.com. Má více než 20 let zkušeností jako profesionální programátor/vývojář softwaru a v současné době pracuje na plný úvazek pro velkou evropskou IT společnost. Pokud zrovna nepíše blog, věnuje svůj volný čas široké škále zájmů, koníčků a aktivit, což se může do jisté míry odrážet v rozmanitosti témat na tomto webu.