किसी मौजूदा एप्लिकेशन में DI / IoC कंटेनर को एकीकृत करने की सिफारिशें


10

अब मुझे मौजूदा एप्लिकेशन में नियंत्रण (IoC) कंटेनर के व्युत्क्रम को एकीकृत करने का सामना करना पड़ रहा है, और मैं कुछ सिफारिशों की तलाश कर रहा हूं कि कैसे युग्मन को कम करने के अंतिम लक्ष्य के साथ आसानी से पूरा किया जा सकता है, जिससे परीक्षण क्षमता बढ़ जाती है। हालांकि मैं आमतौर पर अधिकांश कक्षाओं को वर्गीकृत नहीं कर सकता देव वस्तुओं के , प्रत्येक में बहुत सी जिम्मेदारियाँ होती हैं और स्टैटिक्स, एकल, और इंटरफेस की कमी के माध्यम से छिपी हुई निर्भरता।

यहाँ कुछ चुनौतियों का सामना करने की पृष्ठभूमि है:

  • निर्भरता इंजेक्शन अक्सर उपयोग किया जाता है
  • स्टैटिक तरीके लाजिमी हैं - फैक्ट्री और हेल्पर दोनों तरीकों के रूप में
  • सिंगलेट्स काफी प्रचलित हैं
  • जब उपयोग किया जाता है, तो इंटरफेस भी दानेदार नहीं होते हैं
  • आधार वर्गों के माध्यम से वस्तुएं अक्सर अनावश्यक निर्भरता में खींचती हैं

हमारा आशय यह है कि अगली बार हमें किसी विशेष क्षेत्र में परिवर्तन करने की आवश्यकता है, कि हम निर्भरता को छेड़ने की कोशिश करें, जो कि वास्तविकता में मौजूद है, लेकिन एकल और स्टैटिक्स जैसे ग्लोबल्स के पीछे छिपे हुए हैं।

मुझे लगता है कि IoC कंटेनर निर्भरता इंजेक्शन की शुरूआत के लिए माध्यमिक बनाता है, लेकिन मैं उम्मीद करूंगा कि प्रथाओं और सिफारिशों का एक सेट है जिसका पालन किया जा सकता है या विचार किया जा सकता है जो हमें इन निर्भरताओं को तोड़ने में मदद करेगा।


3
मुझे अब ऐसा करने का कारण पूछना होगा ... यह बदलाव क्या है? रख-रखाव की? स्केलेबिलिटी के बाद से यह तेजी से बढ़ेगा? डेवलपर्स ऊब रहे हैं?
एरॉन मैकिवर

1
मैं अभी हाल ही में कंपनी में शामिल हुआ और कुछ "सर्वोत्तम प्रथाओं" को पेश करने की कोशिश कर रहा हूं। मेरा मुख्य लक्ष्य परीक्षण क्षमता को बढ़ाना और युग्मन को कम करना है। नए कोड के लिए हम आसानी से DI / IoC का उपयोग कर सकते हैं और एक ही बार में सभी मौजूदा कोड को बदलने का प्रयास करने का इरादा नहीं रखते हैं, लेकिन मैं इस बात की सिफारिशें करना चाहता हूं कि हम अगली बार जब हम बेहतर कर रहे हैं, तो हम मौजूदा कोड को सर्वोत्तम तरीके से कैसे बदल सकते हैं। उस क्षेत्र में परिवर्तन। अब तक मैंने जो ऑनलाइन पाया है वह केवल निम्नलिखित है: code.google.com/p/autofac/wiki/ExistingApplications
कालेब पेडरसन

3
जब तक बड़ी संख्या में स्वचालित इकाई / एकीकरण परीक्षण नहीं होते हैं; मौजूदा बुनियादी ढाँचे को तब तक संशोधित करना जब तक कोई समस्या सबसे अच्छी प्रथाओं के लिए मौजूद नहीं है, समस्याओं के लिए पूछ रही है। यहां तक ​​कि अगर आपकी इकाई / एकीकरण परीक्षण सूट ठोस था, तब भी मुझे हिचकिचाहट थी।
आरोन मैकिवर

1
@Aaron मुझे आशा है कि यह ध्वनि नहीं थी जैसे हम इसे सर्वोत्तम प्रथाओं के लिए कर रहे हैं। हम परिवर्तन कर रहे हैं क्योंकि मौजूदा कोड के साथ काम करना कठिन और धीमा है और इसलिए हम उस विशेष क्षेत्र में काम कर रहे हैं। ख़ुशी की बात है कि बदलाव करने के लिए हमारे पास उचित एकीकरण परीक्षण और कुछ इकाई परीक्षणों का एक सेट है।
कालेब पेडरसन

जवाबों:


8

इस तरह से कुछ खींचने के लिए, आपको चरणों में काम करना होगा, इनमें से प्रत्येक तुच्छ नहीं है, लेकिन उन्हें पूरा किया जा सकता है। शुरू करने से पहले, आपको यह समझना होगा कि आप इस प्रक्रिया को शुरू नहीं कर सकते।

  1. आवेदन के प्रमुख उपतंत्र और interfaceउनमें से प्रत्येक के लिए परिभाषित करें। इस इंटरफ़ेस को केवल उन तरीकों को परिभाषित करना चाहिए जो सिस्टम के अन्य भागों से बात करने के लिए उपयोग करेंगे। नोट: आपको इस पर एक से अधिक पास लेने पड़ सकते हैं।
  2. उस इंटरफ़ेस का एक आवरण कार्यान्वयन प्रदान करें जो मौजूदा कोड को दर्शाता है। इस अभ्यास का उद्देश्य एन मास के पुनर्लेखन से बचना है , लेकिन नए इंटरफेस का उपयोग करने के लिए कोड को फिर से भरना है - यानी आपके सिस्टम में युग्मन को कम करना।
  3. आपके द्वारा बनाए गए इंटरफेस और कार्यान्वयन का उपयोग करके सिस्टम बनाने के लिए IoC कंटेनर सेट अप करें। इस स्तर पर आप IoC कंटेनर को इंस्टेंट करने का ध्यान रखना चाहते हैं ताकि यह एप्लिकेशन को ला सके। यानी अगर आप एक सर्वलेट वातावरण में हैं, तो सुनिश्चित करें कि आप सर्वलेट init()विधि में कंटेनर प्राप्त कर सकते हैं / बना सकते हैं ।
  4. प्रत्येक सबसिस्टम के भीतर फिर से वही काम करें, इस बार जब आप रिफ्लेक्टर करते हैं, तो आप अपने स्टब कार्यान्वयन को वास्तविक चीज़ में बदल रहे हैं जो बदले में इसके घटकों से बात करने के लिए इंटरफेस का उपयोग करता है।
  5. आवश्यक होने तक दोहराएं जब तक कि आपके पास कार्यक्षमता के लिए घटक आकार का एक अच्छा संतुलन न हो।

जब आप किए जाते हैं, तो आपके सिस्टम में आपके पास केवल स्थिर तरीके होने चाहिए जो वास्तव में कार्य हैं - उदाहरण के लिए Collectionsवर्ग या Mathवर्ग को देखें। किसी भी स्थिर विधि को अन्य घटकों को सीधे एक्सेस करने का प्रयास नहीं करना चाहिए।

यह कुछ ऐसा है जिसमें बहुत समय लगेगा, तदनुसार योजना बनाएं। सुनिश्चित करें कि जैसे ही आप अपनी रीफैक्टरिंग करते हैं, आप अपने डिजाइन दृष्टिकोण में अधिक ठोस बनते जा रहे हैं। शुरुआत में यह दर्दनाक होगा। आप अपने एप्लिकेशन के डिज़ाइन को बहुत तेज़ी से बदल रहे हैं।


अच्छा सुझाव है। मैं इस तरह के बदलाव करते समय दूसरों को सुझाव यहाँ भी देता हूँ: code.google.com/p/autofac/wiki/ExistingApplications
कालेब पेडरसन

7

उठाओ विरासत कोड के साथ प्रभावी ढंग से काम कर रहे हैं और उनकी सलाह का पालन करें। कवर कोड के द्वीपों के निर्माण से शुरू करें और धीरे-धीरे एक अधिक अच्छी तरह से संरचित आवेदन की ओर बढ़ें। परिवर्तन को मास्क बनाने की कोशिश आपदा के लिए एक नुस्खा है।


उस किताब को प्यार करो !!
मार्टिज़न वेरबर्ग

अच्छी सिफारिश है। हालाँकि मैंने इसका आधा साल पहले पढ़ा था, लेकिन मुझे लगता है कि मैं इससे कहीं अधिक बाहर निकलूंगा कि मैं इस स्थिति में गहरी हूँ।
कालेब पेडरसन

यह मज़ेदार है, चयनित उत्तर मूल रूप से पुस्तक को संक्षेप में प्रस्तुत करता है;) बेशक पंख अधिक विस्तार में जाते हैं।
माइकल ब्राउन

5

आईओसी को शुरू करने के लिए प्राथमिक कारण है decoupling मॉड्यूल की। विशेष रूप से जावा के साथ समस्या असाधारण मजबूत बंधन है जो किnew ऑपरेटर देता है, इसके साथ संयुक्त इसका मतलब है कि कॉलिंग कोड को ठीक से पता है कि यह किस मॉड्यूल का उपयोग करेगा।

इस ज्ञान को एक केंद्रीय स्थान पर ले जाने के लिए फैक्टरियों की शुरुआत की गई, लेकिन अंत में आप अभी भी new/ सिंगलटन का उपयोग करने में मॉड्यूल को सख्त करते हैं जो कि हार्ड बाइंडिंग को बनाए रखता है, या आप एक कॉन्फ़िगरेशन फ़ाइल में पढ़ते हैं और रिफ्लेक्शन करते समय परावर्तन / Class.forName का उपयोग करते हैं जो भंगुर है। ।

यदि आपके पास लक्ष्य संशोधित नहीं है तो IoC आपको कुछ भी नहीं देने वाला है।

यूनिट परीक्षणों का परिचय यह सबसे अधिक संभावना को बदल देगा, क्योंकि आपको उन मॉड्यूल का मजाक उड़ाना होगा जो परीक्षण के अधीन नहीं हैं, और इसे संभालने के लिए सबसे आसान तरीका और साथ ही वास्तविक उत्पादन मॉड्यूल एक ही कोड के साथ उपयुक्त इंजेक्ट करने के लिए एक आईओसी फ्रेमवर्क का उपयोग करना है। मॉड्यूल।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.