我是Dagger 2的新手。我正在尝试在我的Android项目中实现它。
我有Service
需要GoogleApiClient
。我正在使用Dagger将其注入此服务中。
@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
当我构建我的项目时,我得到了这个错误:
locationServiceComponent依赖于多个作用域 组件:@Singleton NetComponent @Singleton RepositoryComponent
我理解我的LocationComponent
不能依赖于两个@Singleton
范围内的组件,但我需要在我的服务中同时使用这两个组件,并且都需要@Singleton
。
有没有更好的选择做同样的事情?
答案 0 :(得分:9)
请注意,虽然您可能有多个标记为@Singleton
的组件,但它们的生命周期将遵循保留组件引用的类的生命周期。
这意味着如果您在活动中初始化并保留NetComponent
和RepositoryComponent
,它将遵循该活动的生命周期,并且不会真正成为应用单身。
因此,您可能在Android应用中不需要多个@Singleton
组件。考虑将两个Singleton组件组合成一个组件,如下所示:
@Component(modules = {AppModule.class, NetModule.class, RepositoryModule.class})
@Singleton
public interface AppComponent {
GoogleApiClient getGoogleApiClient();
DatabaseService getDatabaseService();
}
然后确保在应用程序级别保留此@Singleton
组件,并使其可用于在Fragment或Activity级别初始化的从属组件。
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
,您仍然可以实现关注点分离,因为这些组件是在单独的Dagger 2模块中提供的。