Miklix

Nganggo kerangka SysExtension pikeun Milarian Subkelas mana anu bakal didamel dina Dynamics AX 2012

Diterbitkeun: 16 Pébruari 2025 jam 0.28.54 UTC

Artikel ieu ngajelaskeun kumaha carana make kerangka SysExtension saeutik-dipikawanoh dina Dinamika AX 2012 sarta Dinamika 365 pikeun Operasi instantiate sub kelas dumasar kana hiasan atribut, sahingga pikeun desain gampang extensible tina hirarki kelas processing.


Kaca ieu ditarjamahkeun ku mesin tina basa Inggris supados tiasa diaksés ku saloba-lobana jalma. Hanjakalna, tarjamahan mesin henteu acan janten téknologi anu sampurna, janten kasalahan tiasa lumangsung. Upami anjeun hoyong, anjeun tiasa ningali versi Inggris asli di dieu:

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

Inpormasi dina tulisan ieu dumasar kana Dynamics AX 2012 R3. Ieu bisa atawa bisa jadi teu valid pikeun vérsi séjén. (Update: Abdi tiasa mastikeun yén inpormasi dina tulisan ieu ogé valid pikeun Dynamics 365 for Operations)

Nalika ngalaksanakeun kelas ngolah dina Dynamics AX, anjeun sering disanghareupan nyiptakeun hirarki kelas dimana unggal subclass pakait sareng nilai enum atanapi gaduh sababaraha gandeng data anu sanés. A design Palasik nyaeta lajeng gaduh metoda nyusunna di kelas super, nu boga switch nu nangtukeun mana kelas instantiate dumasar kana input.

Ieu jalan ogé prinsipna, tapi lamun boga loba inputs mungkin béda (loba elemen dina enum atawa meureun input mangrupa kombinasi sababaraha nilai béda), eta bisa jadi tedious sarta rawan kasalahan pikeun ngajaga jeung desain salawasna boga disadvantage nu bakal perlu ngaropea ceuk metoda ngawangun lamun anjeun kantos nambahkeun subclass anyar atawa jieun perobahan nu subclass kudu dipaké dumasar kana input mana.

Untungna, aya cara anu langkung elegan, tapi hanjakalna ogé kirang dikenal, cara ngalakukeun ieu, nyaéta ku ngagunakeun kerangka SysExtension.

Kerangka ieu ngamangpaatkeun atribut anu anjeun tiasa dianggo pikeun ngahias subkelas anjeun pikeun ngajantenkeun sistem tiasa terang mana subkelas anu kedah dianggo pikeun nanganan naon. Anjeun masih peryogi metodeu ngawangun, tapi upami dilakukeun leres, anjeun moal pernah kedah ngarobih nalika nambihan sub-kelas énggal.

Hayu urang tingali conto imajinér sareng sebutkeun yén anjeun badé nerapkeun hirarki anu ngalakukeun sababaraha jinis pamrosésan dumasar kana méja InventTrans. Mana anu kedah dilakukeun gumantung kana StatusReceipt sareng StatusIssue tina rékaman, kitu ogé naha rékamanna aya hubunganana sareng SalesLine, PurchLine atanapi henteu. Ayeuna, anjeun ningali seueur kombinasi anu béda.

Hayu urang lajeng nyebutkeun yén anjeun terang yén pikeun ayeuna anjeun ngan kudu nanganan sakeupeul kombinasi, tapi anjeun ogé nyaho yén anjeun bakal dipenta pikeun bisa nanganan beuki loba kombinasi kana waktu.

Hayu urang tetep kawilang basajan tur nyebutkeun yén pikeun ayeuna anjeun ngan kudu nanganan rékaman patali SalesLine kalawan StatusIssue of ReservPhysical atanapi ReservOrdered, sadaya kombinasi séjén bisa dipaliré keur ayeuna, tapi saprak anjeun terang anjeun bakal kudu nanganan aranjeunna engké, anjeun bakal hoyong ngarancang kode anjeun dina cara nu ngajadikeun eta gampang extensible.

Hierarki anjeun tiasa katingali sapertos kieu pikeun ayeuna:

  • MyProcessor
    • MyProcessor_Sales
      • MyProcessor_Sales_ReservOrdered
      • MyProcessor_Sales_ReservPhysical

Ayeuna, anjeun bisa kalayan gampang nerapkeun métode dina kelas super nu instantiates a subclass dumasar kana ModuleInventPurchSales na enum StatusIssue. Tapi anjeun lajeng bakal perlu ngaropea kelas super unggal waktos Anjeun nambahkeun sub kelas, tur éta teu bener pamanggih warisan dina programming obyék-berorientasi. Barina ogé, anjeun teu kudu ngarobah RunBaseBatch atanapi SysOperationServiceBase unggal waktos Anjeun nambahkeun pakasaban bets anyar.

Gantina, anjeun tiasa nganggo kerangka SysExtension. Éta ngabutuhkeun anjeun pikeun nambihan kelas anu sanés, anu kedah manjangkeun SysAttribute. Kelas ieu bakal dianggo salaku atribut anu anjeun tiasa ngahias kelas ngolah anjeun.

kelas ieu pisan sarupa kumaha anjeun bakal nyieun kelas kontrak data pikeun palaksanaan SysOperation, nu bakal mibanda sababaraha anggota data jeung métode parm pikeun meunangkeun tur nyetel nilai eta.

Dina kasus urang, ClassDeclaration tiasa katingali sapertos kieu:

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

Anjeun kudu nyieun hiji anyar () métode pikeun instantiating sadaya anggota data. Upami anjeun hoyong anjeun tiasa masihan sababaraha atanapi sadayana nilai standar, tapi kuring henteu acan ngalakukeun éta.

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

    super();

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

Sareng anjeun ogé kedah nerapkeun metode parm pikeun tiap anggota data, tapi kuring parantos ngaleungitkeun di dieu sabab kuring yakin anjeun terang kumaha ngalakukeun éta - upami henteu, hayu urang anggap éta latihan ;-)

Ayeuna anjeun tiasa nganggo kelas atribut anjeun pikeun ngahias unggal kelas ngolah anjeun. Salaku conto, deklarasi kelas tiasa sapertos kieu:

[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
{
}

Anjeun tangtosna tiasa namina kelas anjeun ku cara naon waé anu anjeun pikahoyong, anu penting di dieu nyaéta anjeun ngahias kelas anjeun kalayan atribut anu cocog sareng jinis pamrosésan anu aranjeunna lakukeun. (Tapi émut yén aya konvénsi ngaran pikeun hierarki kelas dina Dynamics AX sareng éta mangrupikeun ide anu saé pikeun nuturkeun éta, upami mungkin).

Ayeuna anjeun parantos ngahias kelas anjeun pikeun ngaidentipikasi jinis pamrosésan masing-masing, anjeun tiasa ngamangpaatkeun kerangka SysExtension pikeun instantiate objék tina subkelas upami diperyogikeun.

Dina kelas super anjeun (MyProcessor), anjeun tiasa nambihan metode konstruksi sapertos kieu:

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;
}

Bagian anu pikaresepeun pisan - sareng leres-leres obyék (hampura) tina sadayana tulisan ieu - nyaéta metode getClassFromSysAttribute () dina kelas SysExtensionAppClassFactory. Naon anu dilakukeun ku padika ieu nyaéta yén éta nampi nami kelas super hierarki (sareng kelas super ieu henteu kedah aya di luhur hierarki; éta ngan ukur hartosna kelas anu ngalegaan kelas ieu bakal cocog) sareng hiji objek atribut.

Ieu lajeng mulih hiji obyék kelas nu manjangan kelas super dieusian sarta dipapaésan ku atribut pakait.

Anjeun écés tiasa nambihan langkung seueur validasi atanapi logika kana metode konstruksi anu anjeun pikahoyong, tapi anu penting di dieu nyaéta nalika dilaksanakeun, anjeun henteu kedah ngarobih deui metode ieu. Anjeun tiasa nambihan sub-kelas kana hierarki sareng salami anjeun mastikeun ngahias aranjeunna kalayan leres, metode konstruksi bakal mendakanana sanaos henteu aya nalika ditulis.

Kumaha upami kinerja? Jujur kuring henteu acan nyobian patokan éta, tapi parasaan kuring nyaéta yén ieu sigana langkung parah tibatan desain pernyataan switch klasik. Sanajan kitu, tempo yén jauh paling masalah kinerja dina Dynamics AX disababkeun ku aksés database, Abdi teu bakal salempang teuing ngeunaan eta.

Tangtosna, upami anjeun ngalaksanakeun hiji hal anu ngabutuhkeun rébuan objék pikeun didamel gancang, anjeun panginten badé naliti langkung jauh, tapi dina kasus klasik dimana anjeun ngan ukur instan hiji obyék pikeun ngalakukeun sababaraha pamrosésan anu panjang, kuring ragu éta masalah. Ogé, tempo tip ngungkulan kuring (ayat salajengna), nembongan yen kerangka SysExtension ngandelkeun cache, jadi dina sistem ngajalankeun kuring ragu eta boga kinerja signifikan hit.Troubleshooting: Lamun metoda nyusunna teu manggihan sub-kelas anjeun sanajan anjeun yakin maranéhna geus dipapaésan leres, éta bisa jadi masalah cache. Coba ngabersihan cache dina klien sareng server. Sakuduna teu perlu sabenerna balikan deui AOS, tapi bisa jadi pilihan panungtungan.

Bagikeun on BlueskyBagikeun dina FacebookBagikeun on LinkedInBagikeun dina TumblrBagikeun harga XBagikeun on LinkedInPin on Pinterest

Mikkel Bang Christensen

Ngeunaan Pangarang

Mikkel Bang Christensen
Mikkel mangrupikeun panyipta sareng pamilik miklix.com. Anjeunna gaduh pangalaman langkung ti 20 taun salaku programmer komputer / pamekar software profésional sareng ayeuna padamelan full-time pikeun korporasi IT Éropa anu ageung. Nalika henteu ngeblog, anjeunna nyéépkeun waktos luangna dina sajumlah ageung minat, hobi, sareng kagiatan, anu tiasa ditingali dina rupa-rupa topik anu aya dina halaman wéb ieu.