2015-07-21 11 views
7

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

मैं इस बारे में उलझन में हूं कि इस संदर्भ में क्या अच्छा अभ्यास है। जब मैं Play आधिकारिक दस्तावेज़ पढ़ता हूं, तो यह निर्भरता इंजेक्शन के बारे में संक्षेप में बात करता है और फिर तुरंत @ सिंगलटन एनोटेशन का उल्लेख करता है। और उपलब्ध उदाहरण (http://www.typesafe.com/activator/template/play-guice) एक सिंगलटन "वेलकमटेक्स्ट जेनरेटर" कक्षा के बारे में भी बात करता है।

तो मैं सोच रहा हूं, क्या मुझे सिंगलटन ऑब्जेक्ट्स का उपयोग करना चाहिए क्योंकि उदाहरणों का अर्थ है? यदि ऐसा है, तो पुराने स्थैतिक तरीकों की तुलना में लाभ क्या है? क्या विशिष्ट ऑब्जेक्ट प्रकार हैं (उदा।, नियंत्रक?) जो सिंगलेट्स होना चाहिए, और क्या सिंगलेट्स के रूप में ऑब्जेक्ट्स को चिह्नित करने के लिए प्रदर्शन प्रभाव नहीं हैं?

उत्तर

6

तो मैं सोच रहा हूँ, मैं सिंगलटन वस्तुओं का उपयोग करना चाहिए उदाहरण संकेत लग रहे हैं के रूप में? यदि ऐसा है, तो पुराने स्थैतिक तरीकों की तुलना में लाभ क्या है?

निर्भरता इंजेक्शन एक आवेदन को एक साथ तार करने की तकनीक है। आप ऐसे घटक लिखते हैं जो सीधे एक-दूसरे पर निर्भर नहीं होते हैं। इसके बजाय आप एक-दूसरे के घटकों को इंजेक्ट करते हैं। इस तरह आप कोड की एक पंक्ति को छूए बिना बस अपने आवेदन के पूरे हिस्सों का आदान-प्रदान कर सकते हैं। जब यूनिट परीक्षण लिखने की बात आती है तो निर्भरता इंजेक्शन विशेष रूप से उपयोगी होता है।

स्थिर तरीकों की तुलना में आप सभी फैंसी ओओपी सामान का उपयोग कर सकते हैं। प्रश्न मूल रूप से है "स्थिर तरीकों का नुकसान क्या हैं?"

वहाँ विशिष्ट वस्तु प्रकार हैं (उदाहरण के लिए, नियंत्रक?) है कि एकमात्र होना चाहिए, और वहाँ एकमात्र के रूप में वस्तुओं अंकन नहीं करने के लिए प्रदर्शन निहितार्थ हैं?

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

एक सामान्य नियम के (source) के रूप में जब @Singleton उपयोग करने के लिए अपने प्रश्न के लिए आते हैं,:

इस तरह के विन्यास के रूप में
  • स्टेटफुल वस्तुओं, या काउंटर
  • वस्तुओं है कि महंगे हैं का निर्माण करने या देखने
  • ऑब्जेक्ट्स जो संसाधनों को जोड़ती हैं, जैसे डेटाबेस कनेक्शन पूल।

गुइस एक बहुत व्यापक documentation रास्ते से प्रदान करता है। मैं अत्यधिक समय के माध्यम से ब्राउज़ करने की सलाह देते हैं।

+1

धन्यवाद - यही मुझे चाहिए। मुझे "स्कोप्स" पृष्ठ मिला जो आपने बहुत उपयोगी से जुड़ा था।प्ले प्रलेखन से मेरे लिए यह स्पष्ट नहीं था कि क्यों "सिंगलटन" को हाइलाइट किया जा रहा था, या अन्य विकल्प थे - इससे अधिक समझदारी होती है। – myrosia

+0

थोड़ा अधिक शोध के बाद, एक संभावित चेतावनी: "स्कोप्स" गिस पेज अनुरोध स्कोप और सत्र स्कोप के बारे में बात करता है, लेकिन जैसा कि मैं सबसे अच्छा कह सकता हूं, Play उन लोगों का समर्थन नहीं करता है, क्योंकि यह Google के सर्वलेट कंटेनर कार्यान्वयन का उपयोग नहीं करता है और नहीं इस समय अपने आप को प्रदान करें। तो उस अर्थ में दस्तावेज़ पृष्ठ भ्रामक हो सकता है, क्योंकि यह कार्यान्वयन निर्भरता को स्पष्ट नहीं करता है। – myrosia

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