2015-07-10 47 views
8

是的,我知道這已經被問過,是的,我知道它是「按設計」。Dagger2:組件不能依賴於多個範圍的組件

但我想要做這樣的事情:

@Component(modules = {RealmModule.class}) 
public interface RealmComponent { 
    Realm realm(); 
} 


@Component(modules = {RepositoryModule.class}) 
public interface RepositoryComponent { 
    PersonRepository personRepository(); 

    ScheduleRepository schedulesRepository(); 
} 

@Component(dependencies = {RealmComponent.class, RepositoryComponent.class}) 
public interface AppDataComponent 
     extends RealmComponent, RepositoryComponent { 
} 

@ApplicationScope 
@Component(dependencies = {AppContextComponent.class, 
     AppDataComponent.class, 
     AppDomainComponent.class, 
     AppPresentationComponent.class, 
     AppUtilsComponent.class}) 
public interface ApplicationComponent 
     extends AppContextComponent, AppDataComponent, AppDomainComponent, AppUtilsComponent, AppPresentationComponent { 
    void inject(CustomApplication customApplication); 

    void inject(DashboardActivity dashboardActivity); 
} 

不過,我得到的是無範圍,我每次注入JobManagerScheduleRepository或其他任何東西,我得到一個新的實例。我可以「修復」這是唯一的方法。

@Module 
public class JobManagerModule { 
    private JobManager jobManager; 

    @Provides 
    public JobManager jobManager(Context context) { 
     if(jobManager == null) { 
      jobManager = new JobManager(context, new Configuration.Builder(context).networkUtil(
        new WifiOrMobileNetworkUtil(context)).build()); 
     } 
     return jobManager; 
    } 
} 

不是粉絲。

所以,一個是如何旨在構建和撕開的依賴關係樹,沒有製造具有每一個模塊上市每一個規定方法(而不是這些「子一個大的巨大尤伯杯的blob組件「組件依賴性)?

我嘗試使用子組件爲此,但然後你必須提供最終的每個單一模塊ApplicationComponent

我不確定這裏要做什麼。我曾嘗試爲每個第一級組件指定@Singleton,對於每個AppDataLevelComponent都嘗試指定@SubcomponentScope,我也嘗試爲每個子組件創建一個新的作用域,但兩者都因「不能依賴多個作用域組件」而失敗。

編輯:顯然是爲了獲得範圍的供應商,標誌着與範圍的組件是不夠的 - 你必須得指定@Provides註釋的方法的範圍。

@Module 
public class RepositoryModule { 
    @Provides 
    @Singleton 
    public PersonRepository personRepository() { 
     return new PersonRepositoryImpl(); 
    } 

    @Provides 
    @Singleton 
    public ScheduleRepository schedulesRepository() { 
     return new SchedulesRepositoryImpl(); 
    } 
} 

在此期間,我結束了這個超級零部件。

@Singleton 
@Component(modules = { 
     AppContextModule.class, 
     DbMapperModule.class, 
     DbTaskModule.class, 
     RealmModule.class, 
     RepositoryModule.class, 
     InteractorModule.class, 
     ServiceModule.class, 
     PresenterModule.class, 
     XmlPersisterModule.class 
}) 
public interface ApplicationComponent 
     extends AppContextComponent, AppDataComponent, AppDomainComponent, AppUtilsComponent, AppPresentationComponent { 

xyzComponent類只是接口存儲計提方法...

請注意this structure is an anti-pattern as described by Martin Fowler, and you should organize modules based on features/activities,並讓他們到使用組件的依賴subscoped組件。組件的依賴用於子範圍你的超級組件和「繼承」依賴提供者)。

回答