9

मुझे आश्चर्य है कि मुझे अपने निर्भरता इंजेक्शन कंटेनर को कैसे स्टोर/संदर्भित करना चाहिए। क्या यह एक स्थिर वर्ग पर एक कंटेनर एक स्थैतिक संपत्ति होने के लिए ठीक है? या क्या मेरे पास कंटेनर एप्लिकेशन पर एक आवृत्ति चर होना चाहिए? मैं सोच रहा हूं कि प्रत्येक विकल्प के पेशेवर और विपक्ष क्या हैं, और वेब, एमवीसी, कंसोल और विंडोज ऐप में इसके लिए सबसे अच्छा अभ्यास क्या है?मुझे अपने डी कंटेनर के संदर्भ को कहां रखा जाना चाहिए?

+0

डुप्लिकेट: http://stackoverflow.com/questions/644747/autofac-in-web-plplications-where-should-i-store-the-container-for-easy-access http://stackoverflow.com/ प्रश्न/277438/अमूर्त-आईओसी-कंटेनर-पीछे-ए-सिंगलटन-कर-गलत-गलत http://stackoverflow.com/questions/480286/best-practices-for-ioc-container http://stackoverflow.com/ प्रश्न/367178/उपयोग-के-आईओसी-कंटेनर-विशेष रूप से विंडसर http://stackoverflow.com/questions/1612682/typical-ioc-container-usage-passing-data-down-the-line –

+1

सभी को धन्यवाद! सभी डुप्लीकेट्स के लिए खेद है - मुझे लगा कि यह एक डुप्लिकेट था लेकिन मुझे यकीन नहीं था कि मेरे प्रश्न को कैसे ढूंढें। –

उत्तर

5

मैं इसे एप्लिकेशन पर एक आवृत्ति चर के रूप में संग्रहीत करने की अनुशंसा करता हूं। एक स्थिर संपत्ति का उपयोग करना - इसे एक विश्व स्तर पर सुलभ सिंगलटन बनाना - उस पर आपके एप्लिकेशन की निर्भरता को छुपाता है, जो कि उन चीजों में से एक है जिसे आप पहले स्थान पर एक निर्भरता इंजेक्शन कंटेनर का उपयोग करके दूर करने की कोशिश कर रहे हैं!

यह कहकर कि, यदि आपका ढांचा आपके आवेदन उदाहरण तक पहुंचने में मुश्किल बनाता है, तो यह स्थिर चर का उपयोग करने के लिए दुनिया का अंत नहीं होगा।

1

मैं इस पर श्री शाश्वत से सहमत हूं। विचार करने की एक बात यह है कि कुछ डी कंटेनर IDISposable लागू करते हैं, इसलिए आप शायद सामान्य प्रोग्राम समाप्ति पर कंटेनर का निपटान करना चाहते हैं। How do you reconcile IDisposable and IoC?

यह भी ध्यान रखें कि आपके पूरे एप्लिकेशन में डी कंटेनर पर स्कैटरिंग निर्भरताओं से बचने के लिए अक्सर सबसे अच्छा होता है। दूसरे शब्दों में, Service Locator के रूप में उपयोग करने के लिए कंटेनर को विश्व स्तर पर उपलब्ध (सिंगलटन, स्थिर संपत्ति, या यहां तक ​​कि इंजेक्शन) बनाने से बचने का प्रयास करें।

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

+1

सहमत हुए, और मुझे यह पसंद है कि एक पोस्टर ने इसे डुप्लिक में से एक में कैसे रखा है मॉरीसिओ ने खोला: "आईओसी कंटेनर को प्रक्रिया में उच्चतम स्तर/एंट्री पॉइंट पर रखें और इसके नीचे सब कुछ में निर्भरता इंजेक्ट करने के लिए इसका इस्तेमाल करें।" (http://stackoverflow.com/questions/480286/best-practices-for-ioc-container) –

+0

@ जेफ - अच्छा उद्धरण; सरल और सटीक। इस लिंक (मॉरिसियो से भी) में थॉर्स्टन लोरेंज द्वारा एक उत्कृष्ट उत्तर भी है: http://stackoverflow.com/questions/480286/best-practices-for-ioc-container – TrueWill

+0

यदि आप कंटेनर को उच्चतम स्तर पर रखते हैं, यह संभवतः आपके निम्नतम स्तर की असेंबली का संदर्भ रखने की आवश्यकता बनाता है जिसके लिए इंजेक्शन (डेटा एक्सेस शायद) की आवश्यकता होती है। यह मुझे थोड़ा परेशान करता है :( – dougajmcdonald

संबंधित मुद्दे