是的,我知道這已經被問過,是的,我知道它是「按設計」。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);
}
不過,我得到的是無範圍,我每次注入JobManager
或ScheduleRepository
或其他任何東西,我得到一個新的實例。我可以「修復」這是唯一的方法。
@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組件。組件的依賴用於子範圍你的超級組件和「繼承」依賴提供者)。