2016-12-01 7 views
6

मैं डैगर 2 के लिए काफी नया हूं। मैं इसे अपने एंड्रॉइड प्रोजेक्ट में लागू करने की कोशिश कर रहा हूं। मेरे पास Service है जिसे GoogleApiClient की आवश्यकता है। मैं इस सेवा में इंजेक्ट करने के लिए डैगर का उपयोग कर रहा हूं।डैगर 2: घटक एक से अधिक स्कॉप्ड घटक पर निर्भर करता है

@FragmentScoped 
@Component(dependencies = {NetComponent.class, RepositoryComponent.class}) 
public interface CustomServiceComponent { 
    void inject(CustomService customService); 
} 

@Singleton 
@Component(modules = {AppModule.class, NetModule.class}) 
public interface NetComponent { 
    GoogleApiClient getGoogleApiClient(); 
} 

@Singleton 
@Component(modules = {AppModule.class, RepositoryModule.class}) 
public interface RepositoryComponent { 
    DatabaseService getDatabaseService(); 
} 

AppModule, NetModule, और RepositoryModule है तरीकों चिह्नित @Singleton @Provides जब मैं अपने परियोजना का निर्माण मैं इस त्रुटि मिलती है:

The locationServiceComponent depends on more than one scoped component: @Singleton NetComponent @Singleton RepositoryComponent

मैं समझता हूँ कि मेरी LocationComponent दो @Singleton scoped घटकों पर निर्भर नहीं रह सकते, लेकिन मैं दोनों की जरूरत है उनमें से मेरी सेवा में और दोनों को @Singleton होना चाहिए।

क्या वही काम करने का कोई बेहतर विकल्प है?

+0

"मैं अपना स्थान समझता हूं कॉम्पोनेंट दो @ सिंगलेटन स्कॉप्ड घटकों पर निर्भर नहीं हो सकता" -> क्या आप समझा सकते हैं कि यह क्यों संभव नहीं है? –

उत्तर

6

ध्यान रखें कि यद्यपि आपके पास @Singleton चिह्नित कई घटक हो सकते हैं, उनके जीवन चक्र कक्षा के उन लोगों का पालन करेंगे जहां आप घटक के संदर्भ को बनाए रखते हैं।

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

इसलिए, आपको शायद एंड्रॉइड ऐप में एक से अधिक @Singleton घटकों की आवश्यकता नहीं होगी। इस तरह एक घटक में अपने दो सिंगलटन घटकों के संयोजन पर विचार करें:

@Component(modules = {AppModule.class, NetModule.class, RepositoryModule.class}) 
@Singleton 
public interface AppComponent { 
    GoogleApiClient getGoogleApiClient(); 

    DatabaseService getDatabaseService(); 
} 

तो सुनिश्चित करें कि आप आवेदन स्तर पर इस @Singleton घटक को बनाए रखने और यह निर्भर घटकों में उपयोग कि टुकड़ा या गतिविधि के स्तर पर initialised कर रहे हैं के लिए उपलब्ध बनाने बनाते हैं।

public class MyApp extends Application { 

    private final AppComponent appComponent; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     appComponent = DaggerAppComponent.builder() 
          //modules if necessary 
          .build(); 
    } 

    public AppComponent getAppComponent() { 
     return appComponent; 
    }     
} 

ध्यान दें कि जब तक आपके @FragmentScoped किसी भी निर्भर घटकों खुद को नहीं है, तो आप अभी भी आप की तरह के रूप में इन के रूप में कई बना सकते हैं।

ध्यान दें कि भले ही एक घटक अब GoogleApiClient और DatabaseService इंजेक्ट करता है, फिर भी आप चिंताओं को अलग करते हैं क्योंकि ये अलग-अलग डैगर 2 मॉड्यूल में उपलब्ध कराए जाते हैं।

+0

यह इस समाधान को गंदा है। आप AppComponent सभी मॉड्यूल साझा करते हैं, इसके बजाय मैं आवश्यक कॉन्फ़िगरेशन और प्रदान किए गए घटक की आवश्यकता के आधार पर कई अन्य लोगों से अपने घटक को लिखने में सक्षम होना चाहता हूं। उसको कैसे करे? Crysis अच्छी तरह से संरचना – murt

+0

@murt वह एक गैर-सिंगलटन गुंजाइश पर सिंगलटन निर्भरताओं प्रदान करने की कोशिश कर रहा है। वह काम नहीं करेगा। आप सही हैं कि उन्हें पुनर्गठन की जरूरत है, लेकिन उन्हें घटक या समूह के स्तर पर एक एकल ऐप-स्कोप्ड घटक और उसके बाद उप-संयोजक या आश्रित घटक द्वारा दायरे को समूहबद्ध करने की आवश्यकता है। –

+0

@murt आप निर्भर घटकों का उपयोग कर कुछ अन्य उत्तरों को देख सकते हैं https://stackoverflow.com/a/40751767/5241933 –

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