Miklix

Nggunakake Kerangka SysExtension kanggo Nggoleki Subkelas Endi sing Digawe Instantiate ing Dynamics AX 2012

Diterbitake: 16 Februari 2025 ing 00:26:25 UTC

Artikel iki njlèntrèhaké carane nggunakake framework SysExtension sethitik-dikenal ing Dynamics AX 2012 lan Dynamics 365 kanggo Operasi kanggo instantiate sub kelas adhedhasar paesan atribut, ngidini kanggo desain gampang extensible saka hirarki kelas Processing.


Kaca iki diterjemahake mesin saka basa Inggris supaya bisa diakses dening akeh wong. Sayange, terjemahan mesin durung dadi teknologi sing sampurna, mula kesalahan bisa kedadeyan. Yen sampeyan seneng, sampeyan bisa ndeleng versi Inggris asli ing kene:

Using the SysExtension Framework to Find Out Which Subclass to Instantiate in Dynamics AX 2012

Informasi ing kirim iki adhedhasar Dynamics AX 2012 R3. Bisa uga ora bener kanggo versi liyane. (Update: Aku bisa konfirmasi manawa informasi ing artikel iki uga bener kanggo Dynamics 365 for Operations)

Nalika ngetrapake kelas pangolahan ing Dynamics AX, sampeyan kerep ngadhepi nggawe hirarki kelas sing saben subkelas cocog karo nilai enum utawa duwe kopling data liyane. A desain klasik banjur duwe cara mbangun ing kelas super, kang wis ngalih sing nemtokake kang kelas kanggo instantiate adhedhasar input.

Iki bisa uga ing asas, nanging yen sampeyan duwe akeh macem-macem masukan bisa (akeh unsur ing enum utawa mbok menawa input kombinasi saka sawetara nilai beda), bisa dadi tedious lan kesalahan-rawan kanggo njaga lan desain tansah duwe kerugian sing bakal kudu ngowahi ngandika mbangun cara yen sampeyan tau nambah subclass anyar utawa nggawe owahan kanggo kang subclass kudu digunakake adhedhasar input kang.

Begjanipun, ana cara sing luwih elegan, nanging sayangé uga kurang dikenal, kanggo nindakake iki, yaiku kanthi nggunakake kerangka SysExtension.

Kerangka iki njupuk kauntungan saka atribut sing bisa digunakake kanggo dekorasi sub kelas supaya sistem bisa ngerteni subkelas sing kudu digunakake kanggo nangani apa. Sampeyan isih mbutuhake cara mbangun, nanging yen rampung kanthi bener, sampeyan ora bakal kudu ngowahi nalika nambahake sub kelas anyar.

Ayo goleki conto khayalan lan ujar manawa sampeyan bakal ngetrapake hierarki sing nindakake sawetara pangolahan adhedhasar tabel InventTrans. Pangolahan sing kudu ditindakake gumantung marang StatusReceipt lan StatusIssue saka cathetan, uga apa cathetan kasebut ana hubungane karo SalesLine, PurchLine utawa ora. Saiki, sampeyan lagi ndeleng macem-macem kombinasi.

Ayo dadi ngomong sing ngerti saiki sampeyan mung kudu nangani sawetara kombinasi, nanging uga ngerti sing bakal dijaluk kanggo bisa kanggo nangani liyane lan liyane kombinasi liwat wektu.

Ayo dadi tetep relatif prasaja lan ngomong sing saiki sampeyan mung kudu nangani cathetan related kanggo SalesLine karo StatusIssue saka ReservPhysical utawa ReservOrdered, kabeh kombinasi liyane bisa digatèkaké kanggo saiki, nanging amarga sampeyan ngerti sampeyan bakal kudu nangani mengko, sampeyan bakal pengin ngrancang kode ing cara sing ndadekake iku gampang extensible.

Hierarki sampeyan bisa uga katon kaya iki kanggo saiki:

  • MyProcessor
    • MyProcessor_Sales
      • MyProcessor_Sales_ReservOrdered
      • MyProcessor_Sales_ReservPhysical

Saiki, sampeyan bisa kanthi gampang ngleksanakake cara ing kelas super sing instantiates subclass adhedhasar ModuleInventPurchSales lan StatusIssue enum. Nanging sampeyan kudu ngowahi kelas super saben-saben sampeyan nambahake sub kelas, lan dudu ide warisan ing program berorientasi obyek. Sawise kabeh, sampeyan ora perlu ngowahi RunBaseBatch utawa SysOperationServiceBase saben-saben sampeyan nambah proyek kumpulan anyar.

Nanging, sampeyan bisa nggunakake framework SysExtension. Sing mbutuhake sampeyan nambah kelas liyane, sing kudu ngluwihi SysAttribute. Kelas iki bakal digunakake minangka atribut sing bisa sampeyan dekorasi kelas pangolahan.

Kelas iki meh padha karo carane nggawe kelas kontrak data kanggo implementasine SysOperation, amarga bakal duwe sawetara anggota data lan cara parm kanggo njupuk lan nyetel nilai kasebut.

Ing kasus kita, ClassDeclaration bisa katon kaya iki:

class MyProcessorSystemAttribute extends SysAttribute
{
    ModuleInventPurchSales  module;
    StatusIssue             statusIssue;
    StatusReceipt           statusReceipt
}

Sampeyan kudu nggawe anyar () cara kanggo instantiating kabeh anggota data. Yen sampeyan pengin, sampeyan bisa menehi sawetara utawa kabeh nilai standar, nanging aku durung nindakake.

public void new(ModuleInventPurchSales  _module,
                StatusIssue             _statusIssue,
                StatusReceipt           _statusReceipt)
{
    ;

    super();

    module          = _module;
    statusIssue     = _statusIssue;
    statusReceipt   = _statusReceipt;
}

Lan sampeyan uga kudu ngleksanakake metode parm kanggo saben anggota data, nanging aku wis ngilangi sing ana ing kene amarga aku yakin sampeyan ngerti carane nindakake - yen ora, ayo nimbang latihan ;-)

Saiki sampeyan bisa nggunakake kelas atribut kanggo dekorasi saben kelas pangolahan sampeyan. Contone, deklarasi kelas bisa katon kaya iki:

[MyProcessorSystemAttribute(ModuleInventPurchSales::Sales,
                            StatusIssue::None,
                            StatusReceipt::None)]
class MyProcessor_Sales extends MyProcessor
{
}

[MyProcessorSystemAttribute(ModuleInventPurchSales::Sales,
                            StatusIssue::ReservOrdered,
                            StatusReceipt::None)]
class MyProcessor_Sales_ReservOrdered extends MyProcessor_Sales
{
}

[MyProcessorSystemAttribute(ModuleInventPurchSales::Sales,
                            StatusIssue::ReservPhysical,
                            StatusReceipt::None)]
class MyProcessor_Sales_ReservPhysical extends MyProcessor_Sales
{
}

Sampeyan mesthi bisa menehi jeneng kelas kanthi cara sing dikarepake, sing penting ing kene yaiku dekorasi kelas kanthi atribut sing cocog karo jinis pangolahan sing ditindakake. (Nanging elinga yen ana konvensi jeneng kanggo hierarki kelas ing Dynamics AX lan mesthi apik kanggo ngetutake, yen bisa).

Saiki sampeyan wis dekorasi kelas kanggo ngenali jenis pangolahan saben wong, sampeyan bisa njupuk kauntungan saka SysExtension framework kanggo instantiate obyek saka sub kelas yen perlu.

Ing kelas super (MyProcessor), sampeyan bisa nambah cara mbangun kaya iki:

public static MyProcessor construct(ModuleInventPurchSales _module,
StatusIssue _statusIssue,
StatusReceipt _statusReceipt)
{
    MyProcessor                 ret;
    MyProcessorSystemAttribute  attribute;
    ;

    attribute = new MyProcessorSystemAttribute( _module,
                                                _statusIssue,
                                                _statusReceipt);

    ret = SysExtensionAppClassFactory::getClassFromSysAttribute(classStr(MyProcessor), attribute);

    if (!ret)
    {
        //  no class found
        //  here you could throw an error, instantiate a default
        //  processor instead, or just do nothing, up to you
    }

    return ret;
}

Bagean sing menarik banget - lan obyek kasebut (ngapunten) kabeh kiriman iki - yaiku metode getClassFromSysAttribute () ing kelas SysExtensionAppClassFactory. Apa sing ditindakake dening metode iki yaiku nampa jeneng kelas super hierarki (lan kelas super iki ora kudu ana ing ndhuwur hirarki; mung ateges mung kelas sing ngluwihi kelas iki sing bakal layak) lan obyek atribut.

Banjur ngasilake obyek saka kelas sing ngluwihi kelas super sing ditemtokake lan dihiasi karo atribut sing cocog.

Sampeyan bisa kanthi jelas nambah validasi utawa logika luwih akeh kanggo metode konstruksi sing dikarepake, nanging sing penting ing kene yaiku yen wis dileksanakake, sampeyan ora kudu ngowahi cara iki maneh. Sampeyan bisa nambah sub-kelas menyang hirarki lan anggere sampeyan nggawe manawa sampeyan dekorasi kanthi tepat, cara mbangun bakal nemokake sanajan ora ana nalika ditulis.

Apa babagan kinerja? Aku sajujure durung nyoba kanggo pathokan iku, nanging isine weteng koyo sing iki mbokmenawa performs Samsaya Awon saka desain statement switch klasik. Nanging, ngelingi manawa masalah kinerja paling akeh ing Dynamics AX disebabake dening akses database, aku ora bakal kuwatir banget babagan iki.

Mesthi, yen sampeyan ngleksanakake soko sing mbutuhake ewu obyek digawe cepet, sampeyan bisa uga pengin neliti luwih, nanging ing kasus klasik ngendi sampeyan mung instantiate obyek siji kanggo nindakake sawetara Processing dhowo, Aku mangu iku bakal Matter. Uga, considering tips ngatasi masalah sandi (paragraf sabanjuré), katon sing SysExtension framework gumantung ing caching, supaya ing sistem mlaku aku mangu-mangu iku wis hit kinerja pinunjul.Troubleshooting: Yen cara mbangun ora nemokake sub kelas sanajan sampeyan yakin lagi decorated bener, iku bisa dadi masalah caching. Coba mbusak cache ing klien lan server. Sampeyan ora perlu miwiti maneh AOS, nanging bisa uga dadi pilihan pungkasan.

Nuduhake ing BlueskyNuduhake ing FacebookNuduhake ing LinkedInNuduhake ing TumblrNuduhake ing XNuduhake ing LinkedInPin ing Pinterest

Mikkel Bang Christensen

Babagan Penulis

Mikkel Bang Christensen
Mikkel minangka pencipta lan pemilik miklix.com. Dheweke duwe pengalaman luwih saka 20 taun minangka programmer komputer / pangembang piranti lunak profesional lan saiki kerja full-time kanggo perusahaan IT Eropa sing gedhe. Nalika ora ngeblog, dheweke mbuwang wektu luang kanggo macem-macem minat, hobi, lan kegiatan, sing bisa uga katon ing macem-macem topik sing dibahas ing situs web iki.