2012-12-27 7 views
6

हमारे पास आईओसी का उपयोग कर एएसपी.नेट एमवीसी ऐप है जो सेवाओं में नियंत्रकों और रिपोजिटरी संदर्भों में सेवा संदर्भों को इंजेक्ट करने के लिए है।आईओसी का उपयोग करके, क्या सिंगलटन को क्षणिक लाइफटाइम वाले ऑब्जेक्ट्स से इंजेक्शन दिया जा सकता है?

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

विशेष रूप से, अगर हम निम्नलिखित

RepositoryA है (क्षणिक होने की जरूरत है क्योंकि वर्तमान डिजाइन निर्माता में एक उपयोगकर्ता के संदर्भ injects) serviceà (सिंगलटन) ControllerA (क्षणिक)

तो जैसे instantiated:

public ServiceA(IRepositoryA repo) {} 
public ControllerA(IServiceA service) {} 

क्या रिपोजिटरीए अनिवार्य रूप से तत्काल हो सकता है क्योंकि सेवा ए को तुरंत चालू किया जाता है?

मुझे 99% यकीन है कि उत्तर हाँ है, लेकिन सिर्फ मुझे यहां रिफैक्टरिंग की मात्रा की पुष्टि करना चाहता था।

इसके अलावा, यह मानते हुए सेवा और डेटा संग्रह स्थान किसी भी उपयोगकर्ता/अनुरोध-विशिष्ट उदाहरण चर नहीं था, एक डिजाइन दृष्टिकोण के रूप में, वहाँ किसी भी कारण से उनके लिए एक सिंगलटन जीवन भर उपयोग करने के लिए नहीं है?

+0

मुझे लगता है कि वास्तविक सवाल यह है कि इसे सिंगलटन क्यों होना चाहिए? – dotjoe

+0

@ डॉटोजो जो असली सवाल नहीं है, लेकिन फिर भी एक बहुत अच्छा बिंदु :-)। यह मेरे लिए अजीब है कि एक ऐसी सेवा सिंगलटन के रूप में कॉन्फ़िगर किया गया है लगता है।कोई प्रदर्शन समस्या है? – Steven

+0

इसके अलावा, 'सेवा' श्रेणी का उपयोग जिसमें व्यापार तर्क शामिल है, आजकल मुझे कुछ रोकना पसंद है। यदि आपकी दिलचस्पी है, तो इस आलेख पर एक नज़र डालें जो वर्णन करता है कि व्यापार संचालन/मामलों के मामलों को संदेशों के रूप में परिभाषित करता है] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91)। – Steven

उत्तर

4

यदि एक वस्तु है कि एक सिंगलटन के रूप में इंजेक्ट किया जाता है निर्भरता कि एक क्षणिक जीवन है है, उन निर्भरता अनिवार्य रूप से सिंगलटन के स्वामित्व में किया जा रहा के आधार पर एकमात्र की तरह व्यवहार किया जाएगा?

यह सही है। चूंकि इस तरह के घटक अपनी निर्भरताओं पर निर्भर करते हैं (एक निजी क्षेत्र में उनके संदर्भ को संग्रहीत करके), वे निर्भरता तब तक रहेंगे जब तक घटक स्वयं ही करता है। दूसरे शब्दों में, उनके जीवनकाल को घटक के जीवनकाल में निहित रूप से बढ़ावा दिया जाता है (यदि उनका जीवनकाल छोटा है)।

यदि आपके पास यह है, तो आपकी DI कॉन्फ़िगरेशन निश्चित रूप से गलत है और जल्द ही या बाद में यह बग दिखाई देगा। शायद केवल उत्पादन में और शायद ही कभी आपकी देव मशीन पर: -एस।

सामान्य तौर पर सभी घटकों को कंटेनर द्वारा प्रबंधित केवल कपोल-कल्पना एक उम्र कि बराबर या घटक के ही इससे अधिक का समय है कि पर निर्भर होना चाहिए।

कुछ ढांचे में इन प्रकार की कॉन्फ़िगरेशन त्रुटियों का पता लगाने के लिए विश्लेषण सेवाएं भी होती हैं। फिर भी, सभी निर्भरताओं को तारों के दौरान आपको बहुत सावधान रहना चाहिए। सामान्य तौर पर यह, क्षणिक जब भी संभव हो के रूप में घटकों को कॉन्फ़िगर करने के बाद से एक क्षणिक घटक किसी भी जीवन शैली के निर्भरता को रोकने के लिए अनुमति दी है सबसे सुरक्षित होगा। कई क्षणिक वस्तुओं को सामान्य रूप से एक प्रदर्शन समस्या नहीं होगी। प्रति वेब अनुरोध के बजाय एक बड़ा ऑब्जेक्ट ग्राफ़ बनाना आम तौर पर पर्याप्त तेज़ होगा (अन्यथा DI framework with a higher throughput पर स्विच करने का प्रयास करें)।

+0

डी फ्रेमवर्क लिंक के लिए धन्यवाद (हालांकि मुझे पूरा प्रकटीकरण दिखाई देगा कि आप सरल इंजेक्टर (-;) के लिए काम करेंगे - इस बिंदु पर स्विच करना बहुत मुश्किल हो सकता है, लेकिन आकर्षक। – sydneyos

+0

मैं सरल इंजेक्टर विकसित करता हूं, यह सच है :-) । लिंक एसआई को बढ़ावा देना नहीं था, बल्कि आपको विभिन्न ढांचे की विशेषताओं का एहसास देना था। हालांकि, यदि स्विचिंग फ्रेमवर्क मुश्किल है, तो आपको अपने आवेदन के डिज़ाइन पर एक नज़र डालना पड़ सकता है। आपका आवेदन ढांचे पर बहुत निर्भर हो सकता है। इससे आपके आवेदन की रखरखाव और टेस्टेबिलिटी में बाधा आ जाएगी। हालांकि सरल इंजेक्टर सभी मेरी डीआई जरूरतों के अनुरूप है, मैं हमेशा एसआई पर प्रत्यक्ष निर्भरता लेने की आवश्यकता को रोकता हूं। यहां तक ​​कि अपने स्वयं के अनुप्रयोगों के लिए भी। – Steven