Nggunakake Kerangka SysExtension kanggo Nggoleki Subkelas Endi sing Digawe Instantiate ing Dynamics AX 2012
Diterbitake: 16 Februari 2025 ing 00:26:25 UTC
Dianyari pungkasan: 12 Januari 2026 ing 08:43:36 UTC
Artikel iki njlèntrèhaké carané nggunakaké framework SysExtension sing kurang dikenal ing Dynamics AX 2012 lan Dynamics 365 for Operations kanggo nginstansiasi subkelas adhedhasar dekorasi atribut, sing nggampangaké desain hierarki kelas pangolahan sing bisa diekstensifké.
Using the SysExtension Framework to Find Out Which Subclass to Instantiate in Dynamics AX 2012
Informasi ing kiriman iki adhedhasar Dynamics AX 2012 R3. Iki bisa uga valid utawa ora valid kanggo versi liyane. (Nganyari: Aku bisa ngonfirmasi manawa informasi ing artikel iki uga valid kanggo Dynamics 365 for Operations)
Nalika ngleksanakake kelas pangolahan ing Dynamics AX, sampeyan asring diadhepi nggawe hirarki kelas ing ngendi saben subkelas cocog karo nilai enum utawa duwe sawetara kopling data liyane. Desain klasik yaiku duwe metode konstruksi ing kelas super, sing duwe saklar sing nemtokake kelas endi sing bakal digawe adhedhasar input.
Iki bisa digunakake kanthi becik ing prinsip, nanging yen sampeyan duwe akeh input sing beda-beda (akeh elemen ing enum utawa mungkin input kasebut minangka kombinasi saka sawetara nilai sing beda-beda), bisa dadi mboseni lan rawan kesalahan kanggo dijaga lan desain kasebut mesthi duwe kerugian yaiku sampeyan kudu ngowahi metode konstruksi kasebut yen sampeyan nambah subkelas anyar utawa nggawe pangowahan ing subkelas endi sing kudu digunakake adhedhasar input endi.
Untunge, ana cara sing luwih elegan, nanging sayangé uga kurang dikenal, kanggo nindakake iki, yaiku kanthi nggunakake framework SysExtension.
Kerangka iki nggunakake atribut sing bisa digunakake kanggo dekorasi subkelas supaya sistem bisa nemtokake subkelas endi sing kudu digunakake kanggo nangani apa. Sampeyan isih butuh metode konstruksi, nanging yen ditindakake kanthi bener, sampeyan ora perlu ngowahi nalika nambah subkelas anyar.
Ayo dideleng conto imajiner lan umpami sampeyan arep ngetrapake hirarki sing nindakake sawetara jinis pamrosesan adhedhasar tabel InventTrans. Pamrosesan endi sing kudu ditindakake gumantung saka StatusReceipt lan StatusIssue saka cathetan kasebut, uga apa cathetan kasebut ana gandhengane karo SalesLine, PurchLine utawa ora loro-lorone. Saiki, sampeyan wis ndeleng akeh kombinasi sing beda.
Umpamane sampeyan ngerti yen saiki sampeyan mung perlu nangani sawetara kombinasi, nanging sampeyan uga ngerti yen sampeyan bakal dijaluk supaya bisa nangani kombinasi sing luwih akeh sajrone wektu.
Ayo digawe prasaja wae lan saiki sampeyan mung perlu nangani rekaman sing ana gandhengane karo SalesLine kanthi StatusIssue ReservPhysical utawa ReservOrdered, kabeh kombinasi liyane bisa diabaikan saiki, nanging amarga sampeyan ngerti sampeyan kudu nangani mengko, sampeyan kudu ngrancang kode kanthi cara sing gampang dikembangake.
Hirarki sampeyan bisa uga katon kaya iki kanggo saiki:
- ProsesorkuDodolan_ProsesorkuPesanan_Dodolan_ProsesorkuPesanan_Dodolan_ProsesorkuFisik
Saiki, sampeyan bisa kanthi gampang ngetrapake metode ing kelas super sing nggawe subkelas adhedhasar ModuleInventPurchSales lan enum StatusIssue. Nanging sampeyan banjur kudu ngowahi kelas super saben sampeyan nambah subkelas, lan iku dudu ide pewarisan ing pemrograman berorientasi objek. Sawise kabeh, sampeyan ora perlu ngowahi RunBaseBatch utawa SysOperationServiceBase saben sampeyan nambah tugas batch anyar.
Nanging, sampeyan bisa nggunakake framework SysExtension. Iku mbutuhake sampeyan nambah kelas liyane, sing kudu ngembangake SysAttribute. Kelas iki bakal digunakake minangka atribut sing bisa sampeyan gunakake kanggo dekorasi kelas pangolahan sampeyan.
Kelas iki meh padha karo carane nggawe kelas kontrak data kanggo implementasi SysOperation, amarga bakal duwe sawetara anggota data lan metode parm kanggo njupuk lan nyetel nilai kasebut.
Ing kasus kita, ClassDeclaration bisa katon kaya iki:
{
ModuleInventPurchSales module;
StatusIssue statusIssue;
StatusReceipt statusReceipt
}
Sampeyan kudu nggawe metode new() kanggo nggawe instantiasi kabeh anggota data. Yen sampeyan pengin, sampeyan bisa menehi sawetara utawa kabeh nilai standar, nanging aku durung nindakake.
StatusIssue _statusIssue,
StatusReceipt _statusReceipt)
{
;
super();
module = _module;
statusIssue = _statusIssue;
statusReceipt = _statusReceipt;
}
Lan sampeyan uga kudu ngetrapake metode parm kanggo saben anggota data, nanging aku wis ngilangi ing kene amarga aku yakin sampeyan ngerti carane nindakake - yen ora, ayo dianggep minangka latihan ;-)
Saiki sampeyan bisa nggunakake kelas atribut kanggo dekorasi saben kelas pangolahan sampeyan. Contone, deklarasi kelas bisa katon kaya iki:
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 apa wae sing dikarepake, sing penting ing kene yaiku sampeyan dekorasi kelas nganggo atribut sing cocog karo jinis pangolahan sing ditindakake. (Nanging elinga yen ana konvensi penamaan kanggo hierarki kelas ing Dynamics AX lan mesthi dadi ide sing apik kanggo ngetutake, yen bisa).
Saiki sampeyan wis nghias kelas kanggo ngenali jinis pangolahan sing ditindakake saben kelas, sampeyan bisa nggunakake framework SysExtension kanggo nggawe instantiasi objek saka subkelas yen perlu.
Ing kelas super sampeyan (MyProcessor), sampeyan bisa nambah metode konstruksi kaya iki:
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 pancen menarik - lan pancen obyek (ngapurane lelucon) saka kabeh postingan iki - yaiku metode getClassFromSysAttribute() ing kelas SysExtensionAppClassFactory. Apa sing ditindakake metode iki yaiku nampa jeneng kelas super saka hirarki (lan kelas super iki ora perlu ana ing ndhuwur hirarki; iki mung tegese mung kelas sing ngluwihi kelas iki sing bakal layak) lan objek atribut.
Banjur ngasilake obyek saka kelas sing ngluwihi kelas super sing ditemtokake lan dihias nganggo atribut sing cocog.
Sampeyan mesthi bisa nambah validasi utawa logika luwih lanjut menyang metode konstruk sakarepe sampeyan, nanging sing penting ing kene yaiku sawise dileksanakake, sampeyan ora perlu ngowahi metode iki maneh. Sampeyan bisa nambah subkelas menyang hierarki lan anggere sampeyan mesthekake kanggo dekorasi kanthi bener, metode konstruk bakal nemokake sanajan ora ana nalika ditulis.
Kepiye babagan kinerja? Sejatine aku durung nyoba kanggo ngukur, nanging firasatku iki mbokmenawa kinerjane luwih elek tinimbang desain pernyataan switch klasik. Nanging, ngelingi yen masalah kinerja paling akeh ing Dynamics AX disebabake dening akses database, aku ora bakal kuwatir banget babagan iki.
Mesthi wae, yen sampeyan ngleksanakake apa wae sing mbutuhake ewonan obyek digawe kanthi cepet, sampeyan bisa uga pengin nyelidiki luwih lanjut, nanging ing kasus klasik ing ngendi sampeyan mung nggawe instansiasi obyek siji kanggo nindakake sawetara proses sing dawa, aku ragu iku bakal penting. Uga, ngelingi tips ngatasi masalahku (paragraf sabanjure), katon yen framework SysExtension gumantung ing caching, mula ing sistem sing mlaku aku ragu yen kinerjane bakal mudhun.
Ngatasi masalah: Yen metode konstruksi ora nemokake subkelas sanajan sampeyan yakin manawa wis didekorasi kanthi bener, bisa uga masalah caching. Coba mbusak cache ing klien lan server. Sampeyan ora perlu miwiti maneh AOS, nanging bisa uga dadi pilihan pungkasan.
Wacan Salajengipun
Yen sampeyan seneng karo kiriman iki, sampeyan bisa uga seneng saran iki:
- Kesalahan "Ora ana kelas metadata sing ditetepake kanggo obyek kontrak data" ing Dynamics AX 2012
- Bedane antarane data() lan buf2Buf() ing Dynamics AX 2012
- Ngonversi Real menyang String karo Kabeh Desimal ing Dynamics AX 2012
