Dagger2:组件不能依赖于多个作用域的组件
Dagger2: Component cannot depend on multiple scoped components
是的,我知道以前有人问过这个问题,是的,我知道是 "by design"。
但我想做这样的事情:
@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);
}
但是,我得到的是 unscoped,每次我注入 JobManager
或 ScheduleRepository
或其他任何东西时,I获取一个新实例。我唯一可以 "fix" 的方法就是这样。
@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;
}
}
不是粉丝。
那么,如何构建和分解依赖树,而不 制作一个巨大的 über blob 组件每个模块 列出并每个单独的提供方法(而不是这些 "subcomponent" 组件依赖项)?
我尝试为此使用子组件,但是您必须为最终 ApplicationComponent
.
提供每个模块
我不知道该做什么。我尝试为每个一级组件指定 @Singleton
并为每个 AppDataLevelComponent
指定 @SubcomponentScope
,我还尝试为每个子组件指定一个新范围,但它们都失败了 "cannot depend on multiple scoped components".
编辑: 显然,为了获得作用域提供程序,用作用域标记组件是不够的——您还必须为 @Provides
注释方法指定作用域.
@Module
public class RepositoryModule {
@Provides
@Singleton
public PersonRepository personRepository() {
return new PersonRepositoryImpl();
}
@Provides
@Singleton
public ScheduleRepository schedulesRepository() {
return new SchedulesRepositoryImpl();
}
}
与此同时,我最终得到了这个 übercomponent。
@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,并使用组件依赖将它们变成子作用域组件。组件依赖用于子作用域组件,并且"inherit"依赖提供者。)
我不久前遇到了和你一样的问题,并结束了使用相同的 ubercomponent 方法,除了我使用 @Subcomponent
s 来组织事情而不是在 ubercomponent 中列出所有模块(我称之为 "top" 或 "app's" 组件)。
你可以在这里看到一个例子:
是的,我知道以前有人问过这个问题,是的,我知道是 "by design"。
但我想做这样的事情:
@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);
}
但是,我得到的是 unscoped,每次我注入 JobManager
或 ScheduleRepository
或其他任何东西时,I获取一个新实例。我唯一可以 "fix" 的方法就是这样。
@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;
}
}
不是粉丝。
那么,如何构建和分解依赖树,而不 制作一个巨大的 über blob 组件每个模块 列出并每个单独的提供方法(而不是这些 "subcomponent" 组件依赖项)?
我尝试为此使用子组件,但是您必须为最终 ApplicationComponent
.
我不知道该做什么。我尝试为每个一级组件指定 @Singleton
并为每个 AppDataLevelComponent
指定 @SubcomponentScope
,我还尝试为每个子组件指定一个新范围,但它们都失败了 "cannot depend on multiple scoped components".
编辑: 显然,为了获得作用域提供程序,用作用域标记组件是不够的——您还必须为 @Provides
注释方法指定作用域.
@Module
public class RepositoryModule {
@Provides
@Singleton
public PersonRepository personRepository() {
return new PersonRepositoryImpl();
}
@Provides
@Singleton
public ScheduleRepository schedulesRepository() {
return new SchedulesRepositoryImpl();
}
}
与此同时,我最终得到了这个 übercomponent。
@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,并使用组件依赖将它们变成子作用域组件。组件依赖用于子作用域组件,并且"inherit"依赖提供者。)
我不久前遇到了和你一样的问题,并结束了使用相同的 ubercomponent 方法,除了我使用 @Subcomponent
s 来组织事情而不是在 ubercomponent 中列出所有模块(我称之为 "top" 或 "app's" 组件)。
你可以在这里看到一个例子: