2010-11-03 7 views
6

मेरे पास निर्भरता इंजेक्शन पैटर्न के बारे में एक प्रश्न है। मेरा प्रश्न है ... यदि मैं कन्स्ट्रक्टर इंजेक्शन के लिए जाता हूं, तो मेरी कक्षा के लिए निर्भरता इंजेक्शन देता है, जो मुझे मिलता है वह कई पैरा के साथ "बड़ा" कन्स्ट्रक्टर होता है। यानी क्या होगा। मैं कुछ तरीकों से कुछ पैराम का उपयोग नहीं करता? आईई। मेरे पास एक सेवा है जो कई तरीकों का खुलासा करती है। और 10 पैरामीटर (सभी निर्भरताओं) के साथ एक कन्स्ट्रक्टर। लेकिन सभी विधियां सभी निर्भरताओं का उपयोग नहीं करती हैं। कुछ विधि केवल एक निर्भरता का उपयोग करेंगी, दूसरा 3 निर्भरताओं का उपयोग करेगा। लेकिन डी कंटेनर उन सभी को हल करेगा यदि गैर उपयोग नहीं किया जाता है।डिस्पेंसेंसी इंजेक्शन प्रश्न

मेरे लिए यह डी कंटेनर का उपयोग करने का प्रदर्शन जुर्माना है। क्या ये सच है?

उत्तर

0

आप आलसी प्रदाताओं के पीछे कुछ अभी तक आवश्यक निर्भरताओं को भी छिपा सकते हैं। उदाहरण के लिए:

public DataSourceProvider implements Provider<DataSource> { 

    public DataSource get() { 
     return lazyGetDataSource(); 
    } 

} 

Provider interfacejavax.inject पैकेज का हिस्सा है।

0

दरअसल आप यह नहीं जान सकते कि रनटाइम पर कौन सी विधियों का उपयोग किया जाता है जब आप अपना डी कंटेनर बनाते हैं। आपको उस प्रदर्शन दंड से निपटना होगा या यदि आप जानते हैं कि ऐसे कई मामले हैं जहां केवल कुछ निर्भरताएं उपयोग की जाती हैं, तो आप अपने कंटेनर को कई छोटे कंटेनरों में विभाजित कर सकते हैं जिनके पास कम निर्भरताएं इंजेक्शन दी जाती हैं।

7

ऐसा लगता है कि आपकी कक्षा बहुत अधिक कर रही है, यह SOLID (एकल जिम्मेदारी सिद्धांत) में एस का अनुपालन नहीं करती है, हो सकता है कि आप वर्ग को कम निर्भरताओं वाले कई छोटे वर्गों में विभाजित कर सकें। तथ्य यह है कि सभी तरीकों से सभी निर्भरताओं का उपयोग नहीं किया जाता है।

1

आम तौर पर कई निर्भरताओं को इंजेक्शन देने का प्रदर्शन जुर्माना कम होता है, लेकिन यह आपके द्वारा उठाए गए ढांचे पर निर्भर करता है। कुछ फ्लाई पर इसके लिए विधियों को संकलित करेंगे। आपको इसका परीक्षण करना होगा। कई निर्भरताएं इंगित करती हैं कि आपकी कक्षा बहुत अधिक कर रही है (जैसे रूबेन ने कहा), तो हो सकता है कि आप इसे देखना चाहें। यदि एक प्रतिबाधा का उदाहरण जो आप अक्सर उपयोग नहीं करते हैं तो प्रदर्शन समस्याओं का कारण बनता है, तो आप एक फैक्ट्री को निर्भरता के रूप में पेश करना चाहेंगे। मैंने पाया कि कारखानों का उपयोग निर्भरता इंजेक्शन ढांचे के उपयोग के संबंध में कई समस्याओं को हल कर सकता है।

// Constructor 
public Consumer(IContextFactory contextFactory) 
{ 
    this.contextFactory = contextFactory; 
} 

public void DoSomething() 
{ 
    var context = this.contextFactory.CreateNew(); 
    try 
    { 
     // use context here 

     context.Commit(); 
    } 
    finally 
    { 
     context.Dispose(); 
    } 
} 
0

चूंकि तर्कसंगत रूप से कहते हैं कि आपको अपनी कक्षा के टी डिज़ाइन की समीक्षा सॉलिड सिद्धांतों से चिपकने के लिए करनी चाहिए।

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

+1

उत्परिवर्ती स्थिति से बचा जाना चाहिए लागत। –

+0

मैं आपसे सहमत हूं। मेरे जवाब पर मैं रुबे से सहमत हूं जिन्होंने कहा कि उसे अपनी कक्षा के डिजाइन की समीक्षा करनी चाहिए। मेरी दूसरी टिप्पणी सिर्फ एक प्रैक्टिकल थी :-) –

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