Miklix

डाइनामिक्स एएक्स २०१२ मा कुन उपवर्ग इन्स्ट्यान्ट गर्ने भनेर पत्ता लगाउन सिसएक्सटेन्सन फ्रेमवर्क प्रयोग गर्दै

प्रकाशित: २०२५ फेब्रुअरी १६: ००:२८:५५ UTC
पछिल्लो पटक अद्यावधिक गरिएको: २०२६ जनवरी १२: ०८:४३:४७ UTC

यस लेखले Dynamics AX २०१२ र Dynamics ३६५ मा अपरेशनका लागि कम ज्ञात SysExtension फ्रेमवर्क कसरी प्रयोग गर्ने भनेर वर्णन गर्दछ जसले विशेषता सजावटमा आधारित उप-वर्गहरू स्थापना गर्दछ, जसले प्रशोधन वर्ग पदानुक्रमको सजिलै विस्तार गर्न सकिने डिजाइनको लागि अनुमति दिन्छ।


यो पृष्ठलाई सकेसम्म धेरै मानिसहरूको पहुँचयोग्य बनाउनको लागि अंग्रेजीबाट मेसिन अनुवाद गरिएको थियो। दुर्भाग्यवश, मेसिन अनुवाद अझै पूर्ण प्रविधि होइन, त्यसैले त्रुटिहरू हुन सक्छन्। यदि तपाईं चाहनुहुन्छ भने, तपाईं यहाँ मूल अंग्रेजी संस्करण हेर्न सक्नुहुन्छ:

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

यस पोस्टमा भएको जानकारी Dynamics AX २०१२ R3 मा आधारित छ। यो अन्य संस्करणहरूको लागि मान्य हुन पनि सक्छ र नहुन पनि सक्छ। (अपडेट: म पुष्टि गर्न सक्छु कि यस लेखमा भएको जानकारी सञ्चालनको लागि Dynamics 365 को लागि पनि मान्य छ)

Dynamics AX मा प्रशोधन कक्षाहरू लागू गर्दा, तपाईंले प्रायः एउटा वर्ग पदानुक्रम सिर्जना गर्ने सामना गर्नुहुन्छ जसमा प्रत्येक उपवर्गले enum मानसँग मेल खान्छ वा कुनै अन्य डेटा युग्मन हुन्छ। त्यसपछि एउटा क्लासिक डिजाइन भनेको सुपर क्लासमा निर्माण विधि हुनु हो, जसमा एउटा स्विच हुन्छ जसले इनपुटको आधारमा कुन वर्गलाई इन्स्ट्यान्टिएट गर्ने भनेर निर्धारण गर्दछ।

यो सिद्धान्तमा राम्रोसँग काम गर्छ, तर यदि तपाईंसँग धेरै फरक सम्भावित इनपुटहरू छन् (एनममा धेरै तत्वहरू वा सायद इनपुट धेरै फरक मानहरूको संयोजन हो), यो कायम राख्न कठिन र त्रुटि-प्रवण हुन सक्छ र डिजाइनमा सधैं बेफाइदा हुन्छ कि यदि तपाईंले कहिल्यै नयाँ उपवर्ग थप्नुभयो वा कुन इनपुटको आधारमा कुन उपवर्ग प्रयोग गर्नुपर्छ भनेर परिवर्तन गर्नुभयो भने तपाईंले उक्त निर्माण विधि परिमार्जन गर्नुपर्नेछ।

सौभाग्यवश, यो गर्ने एउटा धेरै सुरुचिपूर्ण, तर दुर्भाग्यवश धेरै कम ज्ञात तरिका पनि छ, अर्थात् SysExtension फ्रेमवर्कको प्रयोग गरेर।

यो फ्रेमवर्कले तपाईंले आफ्नो उपवर्गहरू सजाउन प्रयोग गर्न सक्ने विशेषताहरूको फाइदा लिन्छ ताकि प्रणालीले कुन उपवर्गलाई के ह्यान्डल गर्न प्रयोग गर्नुपर्छ भनेर पत्ता लगाउन सक्षम होस्। तपाईंलाई अझै पनि निर्माण विधि चाहिन्छ, तर यदि सही तरिकाले गरियो भने, नयाँ उपवर्गहरू थप्दा तपाईंले यसलाई कहिल्यै परिमार्जन गर्नुपर्दैन।

एउटा काल्पनिक उदाहरण हेरौं र भनौं कि तपाईं InventTrans तालिकामा आधारित कुनै प्रकारको प्रशोधन गर्ने पदानुक्रम लागू गर्न जाँदै हुनुहुन्छ। कुन प्रशोधन गर्ने भन्ने कुरा रेकर्डहरूको StatusReceipt र StatusIssue मा निर्भर गर्दछ, साथै रेकर्डहरू SalesLine, PurchLine वा दुवैसँग सम्बन्धित छन् कि छैनन् भन्ने कुरामा पनि निर्भर गर्दछ। पहिले नै, तपाईं धेरै फरक संयोजनहरू हेर्दै हुनुहुन्छ।

मानौं, तपाईंलाई थाहा छ कि अहिलेको लागि तपाईंले केही संयोजनहरू मात्र ह्यान्डल गर्न आवश्यक छ, तर तपाईंलाई यो पनि थाहा छ कि समयसँगै तपाईंलाई धेरै भन्दा धेरै संयोजनहरू ह्यान्डल गर्न सक्षम हुन भनिनेछ।

यसलाई तुलनात्मक रूपमा सरल राखौं र भनौं कि अहिलेको लागि तपाईंले केवल ReservPhysical वा ReservOrdered को StatusIssue भएको SalesLine सँग सम्बन्धित रेकर्डहरू ह्यान्डल गर्न आवश्यक छ, अन्य सबै संयोजनहरूलाई अहिलेको लागि बेवास्ता गर्न सकिन्छ, तर तपाईंलाई थाहा छ कि तपाईंले तिनीहरूलाई पछि ह्यान्डल गर्नुपर्नेछ, तपाईं आफ्नो कोडलाई सजिलै विस्तार गर्न सकिने तरिकाले डिजाइन गर्न चाहनुहुन्छ।

तपाईंको पदानुक्रम अहिलेको लागि यस्तो देखिन सक्छ:

  • मेरोप्रोसेसरमेरोप्रोसेसर_बिक्रीमेरोप्रोसेसर_बिक्री_संरक्षितअर्डर गरिएकोमेरोप्रोसेसर_बिक्री_संरक्षितभौतिक

अब, तपाईंले सुपर क्लासमा सजिलैसँग एउटा विधि लागू गर्न सक्नुहुन्छ जसले ModuleInventPurchSales र StatusIssue enum मा आधारित सबक्लासलाई इन्स्ट्यान्टिएट गर्छ। तर त्यसपछि तपाईंले प्रत्येक पटक सबक्लास थप्दा सुपर क्लास परिमार्जन गर्नुपर्नेछ, र त्यो वास्तवमा वस्तु-उन्मुख प्रोग्रामिङमा इनहेरिटेन्सको विचार होइन। आखिर, तपाईंले नयाँ ब्याच कार्य थप्दा प्रत्येक पटक RunBaseBatch वा SysOperationServiceBase परिमार्जन गर्न आवश्यक छैन।

यसको सट्टा, तपाईंले SysExtension फ्रेमवर्क प्रयोग गर्न सक्नुहुन्छ। त्यसका लागि तपाईंले अर्को कक्षा थप्न आवश्यक पर्दछ, जसलाई SysAttribute विस्तार गर्न आवश्यक पर्दछ। यो कक्षा तपाईंले आफ्नो प्रशोधन कक्षाहरू सजाउन सक्ने विशेषताको रूपमा प्रयोग गरिनेछ।

यो वर्ग SysOperation कार्यान्वयनको लागि डेटा अनुबंध वर्ग कसरी बनाउने भन्नेसँग धेरै मिल्दोजुल्दो छ, किनकि यसमा ती मानहरू प्राप्त गर्न र सेट गर्न केही डेटा सदस्यहरू र parm विधिहरू हुनेछन्।

हाम्रो अवस्थामा, ClassDeclaration यस्तो देखिन सक्छ:

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

सबै डेटा सदस्यहरूलाई इन्स्ट्यान्टिएट गर्नको लागि तपाईंले एउटा new() विधि बनाउनु पर्छ। यदि तपाईं चाहनुहुन्छ भने तपाईंले ती मध्ये केही वा सबैलाई पूर्वनिर्धारित मानहरू दिन सक्नुहुन्छ, तर मैले त्यो गरेको छैन।

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

    super();

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

अनि तपाईंले प्रत्येक डेटा सदस्यको लागि parm विधि पनि लागू गर्नुपर्छ, तर मैले ती विधिहरू यहाँ छोडेको छु किनकि मलाई पक्का छ कि तपाईंलाई त्यो कसरी गर्ने भनेर थाहा छ - अन्यथा, यसलाई अभ्यासको रूपमा विचार गरौं ;-)

अब तपाईं आफ्नो प्रत्येक प्रशोधन कक्षाहरू सजाउन आफ्नो विशेषता वर्ग प्रयोग गर्न सक्नुहुन्छ। उदाहरणका लागि, वर्ग घोषणाहरू यस प्रकार देखिन सक्छन्:

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

अवश्य पनि, तपाईंले आफ्नो कक्षाहरूलाई आफूले चाहेको जस्तोसुकै नाम दिन सक्नुहुन्छ, यहाँ महत्त्वपूर्ण कुरा यो हो कि तपाईंले आफ्ना कक्षाहरूलाई तिनीहरूले गर्ने प्रशोधनको प्रकारसँग मेल खाने विशेषताहरूले सजाउनु पर्छ। (तर ध्यान राख्नुहोस् कि Dynamics AX मा वर्ग पदानुक्रमहरूको लागि नामकरण परम्पराहरू छन् र यदि सम्भव छ भने, ती पालना गर्नु सधैं राम्रो विचार हो)।

अब तपाईंले आफ्ना कक्षाहरूलाई प्रत्येकले कस्तो प्रकारको प्रशोधन गर्छ भनेर पहिचान गर्न सजाउनुभएको छ, तपाईंले आवश्यकता अनुसार उप-वर्गहरूको वस्तुहरू स्थापना गर्न SysExtension फ्रेमवर्कको फाइदा लिन सक्नुहुन्छ।

तपाईंको सुपर क्लास (MyProcessor) मा, तपाईंले यस प्रकारको निर्माण विधि थप्न सक्नुहुन्छ:

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

साँच्चै रोचक भाग - र वास्तवमा यो सम्पूर्ण पोस्टको वस्तु (शब्दलाई माफ गर्नुहोस्) - SysExtensionAppClassFactory वर्गमा रहेको getClassFromSysAttribute() विधि हो। यो विधिले के गर्छ भने यसले पदानुक्रमको सुपर वर्गको नाम स्वीकार गर्दछ (र यो सुपर वर्ग पदानुक्रमको शीर्षमा हुनु आवश्यक छैन; यसको अर्थ यो वर्ग विस्तार गर्ने वर्गहरू मात्र योग्य हुनेछन्) र एउटा विशेषता वस्तु।

त्यसपछि यसले निर्दिष्ट सुपर क्लास विस्तार गर्ने र सम्बन्धित विशेषतासँग सजाइएको वर्गको वस्तु फर्काउँछ।

तपाईंले निर्माण विधिमा जति चाहनुहुन्छ त्यति थप प्रमाणीकरण वा तर्क थप्न सक्नुहुन्छ, तर यहाँ महत्त्वपूर्ण कुरा के हो भने एक पटक लागू गरिसकेपछि, तपाईंले यो विधिलाई फेरि कहिल्यै परिमार्जन गर्नुपर्दैन। तपाईं पदानुक्रममा उप-वर्गहरू थप्न सक्नुहुन्छ र जबसम्म तपाईं तिनीहरूलाई उचित रूपमा सजाउन निश्चित गर्नुहुन्छ, निर्माण विधिले तिनीहरूलाई फेला पार्नेछ, यद्यपि यो लेखिएको बेला तिनीहरू अवस्थित थिएनन्।

कार्यसम्पादनको बारेमा के भन्नु पर्दा? मैले इमानदारीपूर्वक यसलाई बेन्चमार्क गर्ने प्रयास गरेको छैन, तर मेरो आन्द्राको भावना यो हो कि यसले सम्भवतः क्लासिक स्विच स्टेटमेन्ट डिजाइन भन्दा खराब प्रदर्शन गर्दछ। यद्यपि, Dynamics AX मा अहिलेसम्म धेरैजसो कार्यसम्पादन समस्याहरू डाटाबेस पहुँचको कारणले हुने भएकोले, म यसको बारेमा धेरै चिन्ता गर्दिन।

अवश्य पनि, यदि तपाईं केहि कार्यान्वयन गर्दै हुनुहुन्छ जसको लागि हजारौं वस्तुहरू द्रुत रूपमा सिर्जना गर्न आवश्यक पर्दछ, तपाईं थप अनुसन्धान गर्न चाहन सक्नुहुन्छ, तर क्लासिक केसहरूमा जहाँ तपाईं केही लामो प्रशोधन गर्न एकल वस्तुलाई मात्र इन्स्ट्यान्टिएट गर्नुहुन्छ, मलाई शंका छ कि यसले फरक पार्नेछ। साथै, मेरो समस्या निवारण सुझाव (अर्को अनुच्छेद) लाई विचार गर्दा, यस्तो देखिन्छ कि SysExtension फ्रेमवर्क क्यासिङमा निर्भर गर्दछ, त्यसैले चलिरहेको प्रणालीमा मलाई शंका छ कि यसको महत्त्वपूर्ण प्रदर्शन हिट छ।

समस्या निवारण: यदि निर्माण विधिले तपाईंको उप-वर्गहरू सही रूपमा सजाइएको छ भनी निश्चित भए तापनि फेला पारेन भने, यो क्यासिङ समस्या हुन सक्छ। क्लाइन्ट र सर्भर दुवैमा क्यासहरू खाली गर्ने प्रयास गर्नुहोस्। वास्तवमा AOS पुन: सुरु गर्न आवश्यक पर्दैन, तर यो अन्तिम उपाय हुन सक्छ।

थप पढाइ

यदि तपाईंलाई यो पोस्ट मन पर्यो भने, तपाईंलाई यी सुझावहरू पनि मन पर्न सक्छन्:


ब्लुस्कीमा सेयर गर्नुहोस्फेसबुक मा शेयर गर्नुहोस्लिंक्डइनमा सेयर गर्नुहोस्Tumblr मा सेयर गर्नुहोस्X मा सेयर गर्नुहोस्लिंक्डइनमा सेयर गर्नुहोस्Pinterest मा पिन गर्नुहोस्

मिकेल क्रिस्टेनसेन

लेखकको बारेमा

मिकेल क्रिस्टेनसेन
मिकेल miklix.com का निर्माता र मालिक हुन्। उनीसँग एक पेशेवर कम्प्युटर प्रोग्रामर/सफ्टवेयर विकासकर्ताको रूपमा २० वर्ष भन्दा बढीको अनुभव छ र हाल उनी एक ठूलो युरोपेली आईटी निगममा पूर्ण-समय कार्यरत छन्। ब्लगिङ नगर्दा, उनी आफ्नो खाली समय विभिन्न रुचि, शौक र गतिविधिहरूमा बिताउँछन्, जुन केही हदसम्म यस वेबसाइटमा समेटिएका विषयहरूको विविधतामा प्रतिबिम्बित हुन सक्छ।