2016-09-26 19 views
7

Burada garip bir sorun var ve neden yaptığımın niçin izinli olduğundan emin değilim. Aşağıdaki modülleri var:Dagger 2 Singleton Bileşeni Singleton'a Bağlı

@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(); 
    } 
} 

Çeşitli nedenlerle, ben (temelde nedeniyle projemin yapısına) aynı bileşende bu iki modüllere sahip olmak istemiyoruz.

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

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

Ama bu derlemeye çalıştığınızda, ben şu hata mesajı alıyorum: Ben aşağıdaki bileşenleri oluşturmaya çalıştık

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

anlıyorum neden farklı kapsamları bağlı olur Kötü ol ve izin ver. Ama Singleton neden Singleton'a izin verilmiyor? Bu işe yarayacak gibi geliyor, çünkü tek yaptığım kardeş komponentleri olduğudur. Neyi kaçırıyorum?

cevap

12

NetComponent bileşeniniz AppComponent bileşeninize bağlı olduğundan, aynı kapsamda olamazlar. Kapsamlar, yaşam çevrimlerini ek açıklama için kullanılır ve NetComponent, Uygulama Bileşenine bağlı olduğu için, aynı yaşam döngüsüne sahip değildir. AppComponent, NetComponent uygulamasının gerçek oluşturma işleminin bir parçası olduğu için, potansiyel olarak NetComponent'ten daha uzun sürebilir. NetComponent, AppComponent olmadan var olamaz, ancak başka bir şekilde değil.

Kendi özel kapsamınızı ekleyebilir ve bunu NetComponent ve NetModule cihazınıza uygulayabilir, bu da bunu düzeltecektir.

+1

Hmm, anladım - bu mantıklı. Ancak, burada açık bir şekilde sorulan soruyu sormak için, bu sınırlamayı daha sonra tüm ek özel kapsamlara da uygulayacağım, doğru mu? "PerApplication" kapsamına sahip olsaydım, bunu NetComponent/Module'e uygulayabilir ve iyi olabilir. Ama eğer NetComponent'e bağlı başka bir bileşen oluşturmak istiyorsam, yine başka bir kapsama ihtiyacım olacaktı (çünkü yaşam döngüsü tekrar biraz farklı olabilir). Bu doğru mu? – tmtrademark

+0

Evet, bu doğru. – ootinii