2015-02-27 8 views
7

से बाध्य नहीं किया जा सका मैं मॉड्यूल को कॉन्फ़िगर करने के बाद पहली बार डैगर की कोशिश कर रहा हूं, मुझे एक त्रुटि मिलती है जिसे मैं समझ नहीं पा रहा हूं।डैगर: वर्ग को

मेरे कोड है:

public class Parrot { 

    private Language language; 

    @Inject 
    public Parrot(Language language) { 
     this.language = language; 
    } 

    public void sayHello() { 
     System.out.println(language.getSalute()); 
    } 
} 

public interface Language { 
    public String getSalute(); 
} 

public class EnglishLanguage implements Language { 

    @Override 
    public String getSalute() { 
     return "Hello!"; 
    } 
} 

मेरे मॉड्यूल

@Module(
     injects = Language.class 
) 
public class PetShopModule { 

    @Provides Parrot provideParrot(Parrot parrot){ 
     return parrot; 
    } 
} 

है और कोड में मैं इसे इस तरह से

EnglishLanguage lang=SystemApp.getSystemLanguage(); 
ObjectGraph objectGraph = ObjectGraph.create(new PetShopModule()); 
objectGraph.inject(myLanguage); 
Parrot parrot = objectGraph.get(Parrot.class); 

संकलक के साथ शिकायत का उपयोग करें:

error: com.example.petshop.Language could not be bound 
with key com.example.petshop.Language required by com.example.petshop.PetShopModule 
for com.example.petshop.PetShopModule 

मैं गलत क्या कर रहा हूं?

नोट: यह केवल एक सरल उदाहरण है, वास्तविक कोड में EnglishLanguage एक प्रणाली वर्ग है, और मैं संशोधित नहीं कर सकते और न ही इसे बनाने के लिए, बस एक संदर्भ

उत्तर

13

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

यह स्निपेट एकदम सही है, और के रूप में यह है रहता है:

public class Parrot { 

    private Language language; 

    @Inject 
    public Parrot(Language language) { 
     this.language = language; 
    } 

    public void sayHello() { 
     System.out.println(language.getSalute()); 
    } 
} 

public interface Language { 
    public String getSalute(); 
} 

public class EnglishLanguage implements Language { 

    @Override 
    public String getSalute() { 
     return "Hello!"; 
    } 
} 
Parrot निर्माता पर @Inject एनोटेशन के साथ

, आप डैगर, "जब भी मैं Parrot का एक उदाहरण का अनुरोध कह रहे हैं, यह निर्माता के लिए उपयोग इसे तुरंत चालू करें "।

डैगर देखता है कि Parrot को Language इंटरफ़ेस का एक उदाहरण चाहिए, और इसे पुनर्प्राप्त करने का कोई तरीका ढूंढने का प्रयास करता है। हालांकि, Language एक इंटरफ़ेस है, इसलिए डैगर को यह जानने की आवश्यकता है कि कंक्रीट उपयोग करने के लिए टाइप करें। ,

@Module 
public class PetshopModule { 

    @Provides 
    Language provideLanguage() { 
    return SystemApp.getSystemLanguage(); 
    } 
} 

अब तुम इस तरह अपने ObjectGraph से बाहर Parrot का एक उदाहरण प्राप्त करने के लिए, सक्षम होना चाहिए:

जब से तुम EnglishLanguage वर्ग संपादित नहीं कर सकते, तो आप इसके लिए एक @Provider विधि लिखने के लिए की आवश्यकता होगी :

ObjectGraph graph = ObjectGraph.create(new PetshopModule()); 
Parrot parrot = graph.get(Parrot.class); 

मैंने इसका परीक्षण नहीं किया है, थोड़ा काम करना चाहिए।


यदि आप EnglishLanguage वर्ग को संशोधित करने में सक्षम थे, तो आप निम्न कर सकता है। @Inject साथ EnglishLanguage निर्माता पर टिप्पणी करें, और Language प्रदाता विधि में एक EnglishLanguage उदाहरण अनुरोध करते हैं:

public class EnglishLanguage implements Language { 

    @Inject 
    public EnglishLanguage() { 
    } 

    @Override 
    public String getSalute() { 
    return "Hello!"; 
    } 
} 

@Module 
public class PetshopModule { 

    @Provides 
    Language provideLanguage(EnglishLanguage language) { 
    return language; 
    } 
} 

इस मामले में, डैगर Language प्रदाता विधि के लिए लग रहा है, और एक EnglishLanguage को दर्शाता है वापस जाने के लिए।

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