2016-09-26 13 views
7

पर निर्भर करता है मुझे यहां एक अजीब समस्या है, और मुझे पूरा यकीन नहीं है कि मैं जो कर रहा हूं उसे अनुमति क्यों नहीं है। मैं निम्नलिखित मॉड्यूल मिल गया है:डैगर 2 सिंगलटन घटक सिंगलटन

@Module 
public final class AppModule { 
    private Context mContext; 

    @Provides 
    @Singleton 
    @AppContext 
    public Context provideContext() { return mContext; } 
} 

@Module 
public final class NetModule { 
    @Provides 
    @Singleton 
    public OkHttpClient provideOkHttp() { 
    return new OkHttpClient.Builder().build(); 
    } 
} 

विभिन्न कारणों से, मैं (मूल रूप से अपने प्रोजेक्ट संरचना की वजह से) एक ही घटक में इन दो मॉड्यूल के लिए नहीं करना चाहती।

@Singleton 
@Component(modules = AppModule.class) 
public interface AppComponent { 
    @AppContext Context appContext(); 
} 

@Singleton 
@Component(dependencies = AppComponent.class, modules = NetModule.class) 
public interface NetComponent { 
    Retrofit retrofit(); 
} 

लेकिन जब मैं इस संकलन करने का प्रयास करें, मैं निम्नलिखित त्रुटि संदेश मिलता है:: तो मैं निम्न घटक बनाने की कोशिश की

Error:(12, 1) error: This @Singleton component cannot depend on scoped components: @Singleton com.myapp.service.dagger.AppComponent

मुझे समझ में क्यों अलग स्कोप के आधार पर होगा बुरा और अस्वीकृत हो। लेकिन सिंगलटन पर निर्भर क्यों है - सिंगलटन पर अनुमति नहीं है? ऐसा लगता है कि इसे काम करना चाहिए, क्योंकि मैं जो कुछ कर रहा हूं वह भाई घटकों को घोषित कर रहा है। मैं क्या खो रहा हूँ?

उत्तर

12

क्योंकि आपका नेटकंपोनेंट घटक आपके ऐपकंपोनेंट घटक पर निर्भर करता है, इसलिए उनके पास एक ही दायरा नहीं हो सकता है। स्कोप्स का उपयोग जीवन चक्रों को एनोटेट करने के लिए किया जाता है, और क्योंकि नेटकंपोनेंट ऐपकंपोनेंट पर निर्भर करता है, उनके पास समान जीवन चक्र नहीं होता है। AppComponent संभावित रूप से NetComponent से अधिक समय तक जीवित रह सकता है, क्योंकि यह NetComponent की वास्तविक निर्माण प्रक्रिया का हिस्सा है। NetComponent AppComponent के बिना मौजूद नहीं हो सका, लेकिन दूसरी तरफ नहीं।

आप अपना खुद का कस्टम स्कोप जोड़ सकते हैं और इसे अपने नेटकंपोनेंट और नेट मॉड्यूल पर लागू कर सकते हैं, जो इसे ठीक करेगा।

+1

हम्म, मैं देखता हूं - यह समझ में आता है। लेकिन यहां स्पष्ट फॉलो-अप प्रश्न पूछने के लिए, मैं इसे लेता हूं, यह सीमा तब भी सभी अतिरिक्त कस्टम स्कोपों ​​पर लागू होगी, है ना? यदि मैंने "PerAplication" दायरा बनाया है, तो मैं इसे NetComponent/मॉड्यूल पर लागू कर सकता हूं और ठीक हो सकता हूं। लेकिन अगर मैं नेटकंपोनेंट पर निर्भर एक और घटक बनाना चाहता था, तो मुझे अभी तक एक और गुंजाइश की आवश्यकता होगी (क्योंकि जीवन चक्र फिर से थोड़ा अलग हो सकता है)। क्या वो सही है? – tmtrademark

+0

हाँ, यह सही है। – ootinii