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
Panungtungan diropéa: 12 Januari 2026 jam 8.43.46 UTC

Artikel ieu ngajelaskeun kumaha ngagunakeun kerangka SysExtension anu teu pati dipikanyaho dina Dynamics AX 2012 sareng Dynamics 365 for Operations pikeun nyieun instansiasi subkelas dumasar kana hiasan atribut, anu ngamungkinkeun desain hirarki kelas pamrosésan anu gampang dilegaan.


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. Éta tiasa valid atanapi henteu pikeun vérsi anu sanés. (Apdet: Abdi tiasa mastikeun yén inpormasi dina tulisan ieu ogé valid pikeun Dynamics 365 for Operations)

Nalika nerapkeun kelas pamrosésan dina Dynamics AX, anjeun sering dihadapkeun kana nyieun hirarki kelas dimana unggal subkelas pakait sareng nilai enum atanapi gaduh sababaraha gandengan data anu sanés. Desain klasik nyaéta teras gaduh metode konstruksi dina kelas super, anu gaduh saklar anu nangtukeun kelas mana anu kedah diinstansiasi dumasar kana input.

Sacara prinsip, ieu jalan kalawan saé, tapi upami anjeun gaduh seueur input anu béda (seueur unsur dina enum atanapi panginten inputna mangrupikeun kombinasi tina sababaraha nilai anu béda), éta tiasa janten ngabosenkeun sareng rawan kasalahan pikeun dijaga sareng desainna salawasna ngagaduhan kalemahan nyaéta anjeun kedah ngarobih metode konstruksi upami anjeun kantos nambihan subkelas énggal atanapi ngarobih subkelas mana anu kedah dianggo dumasar kana input mana.

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

Kerangka ieu ngamangpaatkeun atribut anu anjeun tiasa anggo pikeun ngahias subkelas anjeun supados sistem tiasa nangtoskeun subkelas mana anu kedah dianggo pikeun nanganan naon. Anjeun masih peryogi metode konstruksi, tapi upami dilakukeun kalayan leres, anjeun moal kedah ngarobihna nalika nambihan subkelas énggal.

Hayu urang tingali conto imajinér sareng sebutkeun anjeun badé nerapkeun hirarki anu ngalakukeun sababaraha jinis pamrosésan dumasar kana tabel InventTrans. Pamrosésan mana anu kedah dilakukeun gumantung kana StatusReceipt sareng StatusIssue tina rékaman, ogé naha rékaman éta aya hubunganana sareng SalesLine, PurchLine atanapi henteu duanana. Ayeuna, anjeun parantos ningali seueur kombinasi anu béda.

Hayu urang sebutkeun anjeun terang yén ayeuna anjeun ngan ukur kedah ngurus sababaraha kombinasi, tapi anjeun ogé terang yén anjeun bakal dipenta pikeun tiasa ngurus langkung seueur kombinasi kana waktosna.

Hayu urang tetep saderhana sareng sebutkeun ayeuna anjeun ngan ukur kedah ngatur rékaman anu aya hubunganana sareng SalesLine kalayan StatusIssue ReservPhysical atanapi ReservOrdered, sadaya kombinasi anu sanés tiasa dipaliré ayeuna, tapi kumargi anjeun terang anjeun kedah ngurus éta engké, anjeun kedah ngarancang kode anjeun ku cara anu ngajantenkeun éta gampang dilegaan.

Hirarki anjeun ayeuna tiasa katingali sapertos kieu:

  • MyProcessorMyProcessor_SalesMyProcessor_Sales_ReservedMyProcessor_SalesReservedMyProcessor_SalesFisik

Ayeuna, anjeun tiasa kalayan gampang nerapkeun metode dina kelas super anu ngainstansiasi subkelas dumasar kana ModuleInventPurchSales sareng enum StatusIssue. Tapi anjeun teras kedah ngarobih kelas super unggal anjeun nambihan subkelas, sareng éta sanés ide pewarisan dina pamrograman berorientasi objék. Sabenerna, anjeun henteu kedah ngarobih RunBaseBatch atanapi SysOperationServiceBase unggal anjeun nambihan padamelan batch énggal.

Gantina, anjeun tiasa nganggo kerangka SysExtension. Éta bakal meryogikeun anjeun nambihan kelas anu sanés, anu kedah ngalegaan SysAttribute. Kelas ieu bakal dianggo salaku atribut anu anjeun tiasa ngahias kelas pamrosésan anjeun.

Kelas ieu ampir sami sareng kumaha anjeun ngadamel kelas kontrak data pikeun implementasi SysOperation, nyaéta éta bakal ngagaduhan sababaraha anggota data sareng metode parm pikeun kéngingkeun sareng netepkeun nilai-nilai éta.

Dina kasus urang, ClassDeclaration tiasa katingali sapertos kieu:

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

Anjeun kedah ngadamel metode new() pikeun ngainstansiasi 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 unggal anggota data, tapi kuring parantos ngaleungitkeun éta 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 pamrosésan anjeun. Salaku conto, deklarasi kelas tiasa katingali 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
{
}

Tangtosna anjeun tiasa masihan nami kelas anjeun kumaha waé anu anjeun pikahoyong, bagian anu penting di dieu nyaéta anjeun ngahias kelas anjeun ku atribut anu saluyu sareng jinis pamrosésan anu aranjeunna laksanakeun. (Tapi émut yén aya konvénsi penamaan pikeun hirarki kelas dina Dynamics AX sareng éta salawasna ide anu saé pikeun nuturkeun éta, upami tiasa).

Ayeuna anjeun parantos ngahias kelas anjeun pikeun ngaidentipikasi jinis pamrosésan anu dilakukeun ku masing-masing kelas, anjeun tiasa ngamangpaatkeun kerangka SysExtension pikeun ngainstansiasi objék tina subkelas sakumaha 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 objékna (punten punten) tina sadaya tulisan ieu - nyaéta metode getClassFromSysAttribute() dina kelas SysExtensionAppClassFactory. Anu dilakukeun ku metode ieu nyaéta nampi nami kelas super tina hirarki (sareng kelas super ieu henteu kedah aya di luhur hirarki; éta ngan saukur hartosna ngan ukur kelas anu ngalegaan kelas ieu anu bakal layak) sareng objék atribut.

Teras éta mulangkeun objék tina kelas anu manjangkeun kelas super anu ditangtukeun sareng dihias ku atribut anu saluyu.

Anjeun tangtosna tiasa nambihan validasi atanapi logika salajengna kana metode konstruksi sakumaha anu anjeun pikahoyong, tapi anu penting di dieu nyaéta sakali diimplementasikeun, anjeun henteu kedah ngarobih metode ieu deui. Anjeun tiasa nambihan sub kelas kana hirarki sareng salami anjeun mastikeun pikeun ngahiasna kalayan leres, metode konstruksi bakal mendakanana sanaos éta henteu aya nalika ditulis.

Kumaha upami kinerja? Jujur kuring tacan nyobian ngabandingkeun éta, tapi firasat kuring nyaéta ieu sigana langkung goréng tibatan desain pernyataan switch klasik. Nanging, kumargi masalah kinerja anu paling seueur dina Dynamics AX disababkeun ku aksés database, kuring moal hariwang teuing ngeunaan éta.

Tangtosna, upami anjeun ngalaksanakeun hiji hal anu meryogikeun rébuan objék pikeun didamel gancang, anjeun panginten hoyong nalungtik langkung jauh, tapi dina kasus klasik dimana anjeun ngan ukur ngainstansiasi hiji objék pikeun ngalakukeun sababaraha pamrosésan anu panjang, kuring ragu éta bakal penting. Ogé, ngémutan tip ngungkulan masalah kuring (paragraf salajengna), sigana kerangka SysExtension ngandelkeun caching, janten dina sistem anu ngajalankeun kuring ragu éta ngagaduhan hit kinerja anu signifikan.

Ngungkulan masalah: Upami metode konstruksi henteu mendakan subkelas anjeun sanaos anjeun yakin éta dihias kalayan leres, éta tiasa janten masalah caching. Coba hapus cache dina klien sareng server. Sakuduna henteu kedah ngamimitian deui AOS, tapi éta tiasa janten pilihan terakhir.

Bacaan salajengna

Upami anjeun resep kana tulisan ieu, anjeun ogé tiasa resep saran ieu:


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

Mikkel Christensen

Ngeunaan Pangarang

Mikkel 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.