Kutumia Mfumo wa SysExtension ili kujua ni darasa gani ndogo la instantiate katika Dynamics AX 2012
Iliyochapishwa: 16 Februari 2025, 00:26:12 UTC
Makala hii inaelezea jinsi ya kutumia mfumo wa SysExtension unaojulikana katika Dynamics AX 2012 na Dynamics 365 kwa Uendeshaji ili kuimarisha madarasa madogo kulingana na mapambo ya sifa, kuruhusu muundo wa urahisi wa uongozi wa darasa la usindikaji.
Using the SysExtension Framework to Find Out Which Subclass to Instantiate in Dynamics AX 2012
Habari katika chapisho hili inategemea Dynamics AX 2012 R3. Inaweza au haiwezi kuwa halali kwa matoleo mengine. (Sasisha: Ninaweza kuthibitisha kuwa habari katika nakala hii pia ni halali kwa Dynamics 365 kwa Uendeshaji)
Wakati wa kutekeleza madarasa ya usindikaji katika Dynamics AX, mara nyingi unakabiliwa na kuunda uongozi wa darasa ambao kila darasa ndogo linalingana na thamani ya enum au ina data nyingine ya kuunganisha. Ubunifu wa kawaida ni kuwa na njia ya ujenzi katika darasa kuu, ambayo ina swichi ambayo huamua ni darasa gani la kuthibitisha kulingana na pembejeo.
Hii inafanya kazi vizuri katika kanuni, lakini ikiwa una pembejeo nyingi tofauti iwezekanavyo (vipengele vingi katika enum au labda pembejeo ni mchanganyiko wa maadili kadhaa tofauti), inaweza kuwa ya kuchosha na ya makosa kudumisha na muundo daima una hasara ambayo utahitaji kurekebisha njia ya ujenzi ikiwa utaongeza darasa jipya au kufanya mabadiliko ambayo darasa ndogo inapaswa kutumika kulingana na pembejeo gani.
Kwa bahati nzuri, kuna kifahari zaidi, lakini kwa bahati mbaya pia haijulikani sana, njia ya kufanya hivyo, yaani kwa kutumia mfumo wa SysExtension.
Mfumo huu unachukua faida ya sifa ambazo unaweza kutumia kupamba madarasa yako ndogo ili kufanya mfumo uweze kujua ni darasa gani ndogo linapaswa kutumika kwa kushughulikia nini. Bado utahitaji njia ya ujenzi, lakini ikiwa imefanywa kwa usahihi, hautawahi kuirekebisha wakati wa kuongeza madarasa mapya.
Hebu tuangalie mfano wa kufikiri na kusema kwamba utatekeleza uongozi ambao hufanya aina fulani ya usindikaji kulingana na meza ya InventTrans. Usindikaji gani wa kufanya unategemea StatusReceipt na StatusIssue ya rekodi, na pia ikiwa rekodi zinahusiana na SalesLine, PurchLine au wala. Sasa, wewe ni kuangalia mengi ya mchanganyiko tofauti.
Wacha tuseme kwamba unajua kwamba kwa sasa unahitaji tu kushughulikia mchanganyiko wachache, lakini pia unajua kuwa utaulizwa kuweza kushughulikia mchanganyiko zaidi na zaidi kwa muda.
Wacha tuiweke rahisi na tuseme kwamba kwa sasa unahitaji tu kushughulikia rekodi zinazohusiana na SalesLine na StatusIssue ya ReservPhysical au ReservOrdered, mchanganyiko mwingine wote unaweza kupuuzwa kwa sasa, lakini kwa kuwa unajua itabidi ushughulikie baadaye, utataka kubuni nambari yako kwa njia ambayo inafanya iwe rahisi kuongezeka.
Uongozi wako unaweza kuonekana kitu kama hiki kwa sasa:
- Kichakataji cha MyProcessor
- MyProcessor_Sales
- MyProcessor_Sales_ReservOrdered
- MyProcessor_Sales_ReservPhysical
- MyProcessor_Sales
Sasa, unaweza kutekeleza kwa urahisi njia katika darasa kuu ambalo linathibitisha darasa ndogo kulingana na ModuleInventPurchSales na enum ya StatusIssue. Lakini basi utahitaji kurekebisha darasa kuu kila wakati unapoongeza darasa ndogo, na hiyo sio wazo la urithi katika programu inayoelekezwa na kitu. Baada ya yote, hauitaji kurekebisha RunBaseBatch au SysOperationServiceBase kila wakati unapoongeza kazi mpya ya kundi.
Badala yake, unaweza kutumia mfumo wa SysExtension. Hiyo itahitaji kuongeza darasa lingine, ambalo linahitaji kupanua SysAttribute. Darasa hili litatumiwa kama sifa ambayo unaweza kupamba madarasa yako ya usindikaji.
Darasa hili ni sawa na jinsi ungefanya darasa la mkataba wa data kwa utekelezaji wa SysOperation, kwa kuwa itakuwa na wanachama wengine wa data na mbinu za parm za kupata na kuweka maadili hayo.
Kwa upande wetu, ClassDeclaration inaweza kuonekana kitu kama hiki:
{
ModuleInventPurchSales module;
StatusIssue statusIssue;
StatusReceipt statusReceipt
}
Unahitaji kufanya njia mpya () ya kuthibitisha wanachama wote wa data. Ikiwa unataka unaweza kuwapa baadhi au wote maadili ya default, lakini sijafanya hivyo.
StatusIssue _statusIssue,
StatusReceipt _statusReceipt)
{
;
super();
module = _module;
statusIssue = _statusIssue;
statusReceipt = _statusReceipt;
}
Na unapaswa pia kutekeleza njia ya parm kwa kila mwanachama wa data, lakini nimeondoa wale hapa kwani nina hakika unajua jinsi ya kufanya hivyo - vinginevyo, wacha tuifikirie zoezi ;-)
Sasa unaweza kutumia darasa lako la sifa kupamba kila moja ya madarasa yako ya usindikaji. Kwa mfano, matamko ya darasa yanaweza kuonekana kama hii:
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
{
}
Unaweza bila shaka kutaja madarasa yako kwa njia yoyote unayotaka, sehemu muhimu hapa ni kwamba unapamba madarasa yako na sifa ambazo zinalingana na aina gani ya usindikaji wanayofanya. (Lakini kumbuka kuwa kuna mikataba ya kutaja kwa hierarchies ya darasa katika Dynamics AX na daima ni wazo nzuri kufuata hizo, kama inawezekana).
Sasa kwa kuwa umepamba madarasa yako ili kutambua ni aina gani ya usindikaji kila mmoja wao hufanya, unaweza kuchukua fursa ya mfumo wa SysExtension ili kuthibitisha vitu vya madarasa madogo kama inahitajika.
Katika darasa lako kuu (MyProcessor), unaweza kuongeza njia ya ujenzi kama hii:
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;
}
Sehemu ya kuvutia sana - na kwa kweli kitu (pardon pun) ya chapisho hili lote - ni njia ya getClassFromSysAttribute() katika darasa la SysExtensionAppClassFactory. Njia hii inafanya nini ni kwamba inakubali jina la darasa kuu la uongozi (na darasa hili kuu halihitaji kuwa juu ya uongozi; inamaanisha tu kwamba madarasa tu yanayopanua darasa hili yatastahiki) na kitu cha sifa.
Kisha inarudisha kitu cha darasa ambacho kinapanua darasa kuu lililobainishwa na limepambwa na sifa inayolingana.
Kwa kweli unaweza kuongeza uthibitisho zaidi au mantiki kwa njia ya ujenzi kama unavyotaka, lakini kuchukua muhimu hapa ni kwamba mara moja kutekelezwa, haupaswi kamwe kurekebisha njia hii tena. Unaweza kuongeza madarasa madogo kwenye uongozi na kwa muda mrefu kama wewe kuhakikisha kupamba yao ipasavyo, njia ya ujenzi itawapata hata kama hawakuwa kuwepo wakati ilikuwa imeandikwa.
Vipi kuhusu utendaji? Mimi kwa uaminifu sijajaribu kuionyesha, lakini hisia yangu ya gut ni kwamba hii labda hufanya mbaya zaidi kuliko muundo wa taarifa ya kubadili. Walakini, kwa kuzingatia kuwa kwa mbali maswala ya utendaji zaidi katika Dynamics AX husababishwa na ufikiaji wa hifadhidata, nisingejali sana juu yake.
Bila shaka, ikiwa unatekeleza kitu ambacho kitahitaji maelfu ya vitu kuundwa haraka, unaweza kutaka kuchunguza zaidi, lakini katika kesi za kawaida ambapo unathibitisha tu kitu kimoja kufanya usindikaji mrefu, nina shaka itakuwa jambo. Pia, kwa kuzingatia ncha yangu ya utatuzi ( aya inayofuata), inaonekana kuwa mfumo wa SysExtension unategemea caching, kwa hivyo katika mfumo wa kukimbia nina shaka ina hit kubwa ya utendaji. Kutatua: Ikiwa njia ya ujenzi haipati madarasa yako ndogo ingawa una hakika yamepambwa kwa usahihi, inaweza kuwa shida ya caching. Jaribu kufuta akiba kwenye mteja na seva. Haipaswi kuwa muhimu kuanzisha upya AOS, lakini inaweza kuwa mapumziko ya mwisho.