डाइनामिक्स एएक्स २०१२ मा कुन उपवर्ग इन्स्ट्यान्ट गर्ने भनेर पत्ता लगाउन सिसएक्सटेन्सन फ्रेमवर्क प्रयोग गर्दै
प्रकाशित: २०२५ फेब्रुअरी १६: ००:२८:५५ UTC
यस लेखले वर्णन गर्दछ कि डायनामिक्स एएक्स एक्सएनयूएमएक्स र डायनामिक्स एक्सएनयूएमएक्समा सानो-ज्ञात सिसएक्सटेन्सन फ्रेमवर्क कसरी प्रयोग गर्ने भनेर वर्णन गर्दछ जुन अपरेसनहरूको लागि विशेषता सजावटमा आधारित उप-वर्गहरूलाई इन्स्टेन्ट गर्न, प्रोसेसिंग क्लास पदानुक्रमको सजिलै विस्तारयोग्य डिजाइनको लागि अनुमति दिन्छ।
Using the SysExtension Framework to Find Out Which Subclass to Instantiate in Dynamics AX 2012
यस पोस्टमा जानकारी डायनामिक्स एएक्स 2012 आर 3 मा आधारित छ। यो अन्य संस्करणका लागि मान्य हुन सक्छ वा नहुन पनि सक्छ । (अद्यावधिक: म पुष्टि गर्न सक्छु कि यस लेखमा जानकारी गतिशीलता 365 को लागि सञ्चालनको लागि पनि मान्य छ)
डायनामिक्स एएक्समा प्रोसेसिंग कक्षाहरू लागू गर्दा, तपाईं प्राय: एक वर्ग पदानुक्रम सिर्जना गर्न सामना गर्नुहुन्छ जसमा प्रत्येक उपवर्ग एक गणमत मानसँग मेल खान्छ वा केहि अन्य डेटा युग्मन छ। एक क्लासिक डिजाइन त्यसपछि सुपर वर्गमा एक निर्माण विधि छ, जसमा एक स्विच छ जसले इनपुटको आधारमा कुन वर्गलाई इन्स्टेन्ट गर्ने निर्धारण गर्दछ।
यो सिद्धान्तमा राम्रो काम गर्दछ, तर यदि तपाईंसँग धेरै फरक सम्भावित इनपुटहरू छन् (गणनामा धेरै तत्वहरू वा सम्भवतः इनपुट धेरै फरक मानहरूको संयोजन हो), यो कायम राख्न को लागी कष्टप्रद र त्रुटि-प्रवण हुन सक्छ र डिजाइनमा सँधै बेफाइदा हुन्छ कि तपाईले कहिल्यै नयाँ उपवर्ग थप्नुभयो भने वा कुन उपवर्गमा कुन इनपुटको आधारमा कुन उपवर्ग प्रयोग गर्नु पर्दछ भनेर परिवर्तन गर्न आवश्यक हुनेछ।
सौभाग्यवश, त्यहाँ धेरै सुरुचिपूर्ण छ, तर दुर्भाग्यवश पनि धेरै कम ज्ञात छ, यो गर्ने तरिका, अर्थात् सिसएक्सटेन्सन फ्रेमवर्कको प्रयोग गरेर।
यो ढाँचाले विशेषताहरूको फाइदा लिन्छ जुन तपाईं आफ्नो उप कक्षाहरू सजाउन प्रयोग गर्न सक्नुहुनेछ ताकि प्रणालीलाई कुन उप-वर्गलाई ह्यान्डल गर्नका लागि प्रयोग गर्नु पर्दछ भनेर पत्ता लगाउन सक्षम बनाउँदछ। तपाईंलाई अझै पनि निर्माण विधिको आवश्यकता पर्नेछ, तर यदि सही तरिकाले गरिएको छ भने, तपाईंले नयाँ उप वर्गहरू थप्दा यसलाई कहिल्यै परिमार्जन गर्नुपर्दैन।
आउनुहोस् एक काल्पनिक उदाहरण हेरौं र भन्नुहोस् कि तपाईं एक पदानुक्रम लागू गर्न जाँदै हुनुहुन्छ जुन इन्भेन्टट्रान्स तालिकामा आधारित केहि प्रकारको प्रशोधन गर्दछ। कुन प्रक्रिया गर्ने भन्ने कुरा रेकर्डको स्टेटसरिसिप्ट र स्टाटसइश्यूमा निर्भर गर्दछ, साथै रेकर्डहरू सेल्सलाइन, पर्चलाइन वा नतसँग सम्बन्धित छन् कि छैनन् भन्नेमा निर्भर गर्दछ। पहिले नै अब, तपाईं विभिन्न संयोजन को एक धेरै हेर्दै हुनुहुन्छ.
त्यसोभए भन्नुहोस् कि तपाईंलाई थाहा छ कि अहिलेका लागि तपाईलाई केवल मुट्ठीभर संयोजनहरू ह्यान्डल गर्न आवश्यक छ, तर तपाईंलाई यो पनि थाहा छ कि तपाईंलाई समयको साथ अधिक र अधिक संयोजनहरू ह्यान्डल गर्न सक्षम हुन भनिनेछ।
यसलाई अपेक्षाकृत सरल राख्नुहोस् र भन्नुहोस् कि अहिलेका लागि तपाईले केवल रिजर्भफिजिकल वा रिजर्भअर्डर्डको स्थितिको साथ सेल्सलाइनसँग सम्बन्धित रेकर्डहरू ह्यान्डल गर्न आवश्यक छ, अन्य सबै संयोजनहरू अहिलेका लागि बेवास्ता गर्न सकिन्छ, तर तपाईंलाई थाहा छ कि तपाईंले तिनीहरूलाई पछि ह्यान्डल गर्नुपर्नेछ, तपाईं आफ्नो कोड डिजाइन गर्न चाहानुहुन्छ जसले यसलाई सजिलै सँग एक्सटेन्सिबल बनाउँदछ।
तपाईँको पदानुक्रम अहिलेका लागि केही यस्तो देखिन सक्छ:
- MyProcessor
- MyProcessor_Sales
- MyProcessor_Sales_ReservOrdered
- MyProcessor_Sales_ReservPhysical
- MyProcessor_Sales
अब, तपाईं सजिलैसँग सुपर वर्गमा एक विधि लागू गर्न सक्नुहुनेछ जुन मोड्युलइन्भेन्टपर्चसेल्स र स्टेटसइश्यू एनममा आधारित उपवर्गलाई इन्स्टेन्ट गर्दछ। तर त्यसपछि तपाईंले सुपर वर्गलाई परिमार्जन गर्न आवश्यक छ जब तपाईं उप वर्ग थप्नुहुन्छ, र यो वास्तवमा वस्तु-उन्मुख प्रोग्रामिंगमा विरासतको विचार होइन। आखिर, तपाईँले प्रत्येक पटक नयाँ ब्याच कार्य थप्दा रनबेसब्याच वा सिसअपरेशनसर्भिसबेस परिमार्जन गर्न आवश्यक पर्दैन।
यसको सट्टा, तपाईं सिसएक्सटेन्सन फ्रेमवर्कको प्रयोग गर्न सक्नुहुनेछ। यसले तपाईंलाई अर्को वर्ग थप्न आवश्यक पर्दछ, जुन सिसएट्रिब्यूट विस्तार गर्न आवश्यक छ। यो वर्ग विशेषताको रूपमा प्रयोग गरिनेछ जुन तपाईले आफ्नो प्रोसेसिंग कक्षाहरू सजाउन सक्नुहुनेछ।
यो वर्ग तपाईले सिस्अपरेशन कार्यान्वयनको लागि डेटा अनुबंध वर्ग कसरी बनाउनुहुन्छ भन्ने सँग धेरै मिल्दोजुल्दो छ, जसमा यसमा केहि डेटा सदस्यहरू र ती मानहरू प्राप्त गर्न र सेट गर्नका लागि पार्म विधिहरू हुनेछन्।
हाम्रो मामलामा, क्लासडिक्लेरेसन केहि यस्तो देखिन सक्छ:
{
ModuleInventPurchSales module;
StatusIssue statusIssue;
StatusReceipt statusReceipt
}
तपाईंले सबै डेटा सदस्यहरू तत्काल को लागि एक नयाँ () विधि बनाउन आवश्यक छ। यदि तपाईं चाहनुहुन्छ भने तपाईं तिनीहरूलाई केही वा सबै पूर्वनिर्धारित मानहरू दिन सक्नुहुन्छ, तर मैले त्यसो गरेको छैन।
StatusIssue _statusIssue,
StatusReceipt _statusReceipt)
{
;
super();
module = _module;
statusIssue = _statusIssue;
statusReceipt = _statusReceipt;
}
र तपाईले प्रत्येक डेटा सदस्यको लागि पारम विधि पनि लागू गर्नु पर्दछ, तर मैले ती यहाँ छोडेको छु किनकि मलाई यकीन छ कि तपाईलाई यो कसरी गर्ने थाहा छ - अन्यथा, यसलाई एक अभ्यास विचार गरौं ;-)
अब तपाईं आफ्नो प्रत्येक प्रशोधन कक्षाहरू सजाउन आफ्नो विशेषता वर्ग प्रयोग गर्न सक्नुहुन्छ। उदाहरणका लागि, वर्ग घोषणाहरू यस्तो देखिन सक्छ:
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
{
}
तपाईं पक्कै पनि आफ्नो कक्षाहरू कुनै पनि तरिकाले तपाईं चाहनुहुन्छ नाम गर्न सक्नुहुन्छ, यहाँ महत्त्वपूर्ण भाग यो हो कि तपाईं आफ्नो कक्षाहरू विशेषताहरूसँग सजाउनुहुन्छ जुन उनीहरूले कस्तो प्रकारको प्रक्रियासँग मेल खान्छ। (तर मनमा राख्नुहोस् कि डायनामिक्स एएक्समा वर्ग पदानुक्रमहरूको लागि नामकरण सम्मेलनहरू छन् र तिनीहरूलाई पछ्याउन सधैं राम्रो विचार हो, यदि सम्भव छ भने)।
अब तपाईले आफ्नो कक्षाहरू सजाउनु भएको छ कि तिनीहरूमध्ये प्रत्येकले कस्तो प्रकारको प्रोसेसिंग गर्दछ भनेर पहिचान गर्न, तपाईं आवश्यकता अनुसार उप वर्गहरूको वस्तुहरू इन्स्ट्यान्ट गर्न सिसएक्सटेन्सन फ्रेमवर्कको फाइदा लिन सक्नुहुनेछ।
तपाईंको सुपर क्लास (माईप्रोसेसर) मा, तपाईं यस्तो निर्माण विधि थप्न सक्नुहुनेछ:
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;
}
वास्तवमा रोचक भाग - र वास्तवमा यस सम्पूर्ण पोस्टको वस्तु (पुन: क्षमा गर्नुहोस्) - सिसएक्सटेन्सन एपक्लासफ्याक्ट्री कक्षामा क्लासफ्रमसिसएट्रिब्यूट () विधि हो। यो विधिले के गर्छ भने यसले पदानुक्रमको सुपर वर्गको नाम स्वीकार गर्दछ (र यो सुपर वर्ग पदानुक्रमको शीर्षमा हुनु आवश्यक छैन; यसको अर्थ यो हो कि यो वर्ग विस्तार गर्ने वर्गहरू मात्र योग्य हुनेछन्) र एक विशेषता वस्तु।
त्यसपछि यसले निर्दिष्ट गरिएको सुपर वर्ग विस्तार गर्ने वर्गको वस्तु फर्काउँछ र सम्बन्धित विशेषताले सजाइएको हुन्छ।
तपाईं स्पष्ट रूपमा निर्माण विधिमा धेरै थप प्रमाणीकरण वा तर्क थप्न सक्नुहुनेछ जुन तपाईं चाहानुहुन्छ, तर यहाँ महत्त्वपूर्ण टेकअवे यो हो कि एक पटक लागू भएपछि, तपाईंले यो विधिलाई फेरि कहिल्यै परिमार्जन गर्नु पर्दैन। तपाईं पदानुक्रममा उप वर्गहरू थप्न सक्नुहुन्छ र जबसम्म तपाईं तिनीहरूलाई उचित तरिकाले सजाउन निश्चित गर्नुहुन्छ, निर्माण विधिले तिनीहरूलाई फेला पार्नेछ यद्यपि यो लेखिएको थियो जब तिनीहरू अस्तित्वमा थिएनन्।
प्रदर्शन को बारे मा के? मैले इमानदारीपूर्वक यसलाई बेन्चमार्क गर्ने प्रयास गरेको छैन, तर मेरो आंत भावना यो हो कि यो सम्भवतः क्लासिक स्विच स्टेटमेन्ट डिजाइन भन्दा खराब प्रदर्शन गर्दछ। तथापि, डायनामिक्स एएक्समा सबैभन्दा प्रदर्शन मुद्दाहरू डाटाबेस पहुँचको कारण हुन्छन् भन्ने कुरालाई ध्यानमा राख्दै, म यसको बारेमा धेरै चिन्ता गर्नेछैन।
निस्सन्देह, यदि तपाईं केहि कार्यान्वयन गर्दै हुनुहुन्छ जुन हजारौं वस्तुहरू चाँडै सिर्जना गर्न आवश्यक पर्दछ, तपाईं थप अनुसन्धान गर्न चाहनुहुन्छ, तर क्लासिक केसहरूमा जहाँ तपाईं केहि लामो प्रक्रिया गर्न को लागी एक एकल वस्तु लाई तत्काल गर्नुहुन्छ, मलाई शंका छ कि यो कुरा हुनेछ। साथै, मेरो समस्या निवारण टिप (अर्को अनुच्छेद) लाई ध्यानमा राख्दै, यो देखिन्छ कि सिसएक्सटेन्सन फ्रेमवर्क क्याचिंगमा निर्भर गर्दछ, त्यसैले चलिरहेको प्रणालीमा मलाई शंका छ कि यसको महत्त्वपूर्ण प्रदर्शन हिट छ। समस्या निवारण: यदि निर्माण विधिले तपाईंको उप कक्षाहरू फेला पार्दैन भने पनि तपाईं निश्चित हुनुहुन्छ कि तिनीहरू सही तरिकाले सजाइएका छन्, यो एक क्याचिंग समस्या हुन सक्छ। क्लाइन्ट र सर्भर दुवैमा क्यास हरू खाली गर्ने प्रयास गर्नुहोस्। यो वास्तवमा एओएस पुन: सुरु गर्न आवश्यक हुनुहुँदैन, तर यो अन्तिम उपाय हुन सक्छ।