2013-08-20 13 views
15

मैं अपने प्रोजेक्ट पर काम करने के लिए Dagger प्राप्त करने का प्रयास कर रहा हूं।डिफ़ॉल्ट रचनाकारों पर डैगर

हालांकि मैं संकलन के दौरान मेरी वर्गों में से एक पर निम्न अपवाद प्राप्त करें:

error: No injectable members on Foo. Do you want to add an injectable constructor?

हालांकि, वर्ग कोई निर्भरता है और के रूप में इस तरह के डिफ़ॉल्ट कोई आर्ग निर्माता का उपयोग करता है:

public class Foo 
{ 
    ... 
} 

क्या मुझे वास्तव में नीचे इंजेक्शन योग्य नो-एर्ग कन्स्ट्रक्टर जोड़ना है?

public class Foo 
{ 
    @Inject 
    public Foo() 
    { 
    } 

    .... 
} 

उत्तर

21

डैगर सक्रिय रूप से अपने इंजेक्शन वर्ग के लिए @Inject जोड़ने के लिए, या तो नो-args निर्माता जोड़ने, या एक इंजेक्शन क्षेत्र जोड़कर आप की आवश्यकता है।

@Module(...) 
class MyModule { 
    @Provides Foo provideFoo() { 
    return new Foo(); // Foo is not injectable. 
    } 
} 

इस अतिरिक्त बॉयलरप्लेट की तरह लग रहा है, लेकिन Guice और अन्य व्यवस्थाएं, JIT के साथ अनुभव से यादृच्छिक वर्गों के बंधन पता चला है के साथ व्याप्त होने के लिए: तीसरा विकल्प तो जैसे एक @Provides विधि से वर्ग वापस जाने के लिए है त्रुटि। हमने java.lang.String को चीजों में इंजेक्शन दिया है, और क्योंकि कोई इसे बांधने के लिए भूल गया है, तो आप इच्छित स्ट्रिंग के बजाय इंजेक्शन के साथ समाप्त हो गए हैं। इसलिए, डैगर को @ इंजेक्टर कन्स्ट्रक्टर या फ़ील्ड की आवश्यकता होती है। (गुइस वैकल्पिक रूप से 4.x में है, हालांकि पिछली संगतता के लिए, यह डिफ़ॉल्ट रूप से बंद है)

यह एक दुर्लभ उदाहरण है जहां डैगर ने अधिक शुद्धता गारंटी चुनी है कुछ छोटी मात्रा में verbosity की लागत पर।

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