我有一个需要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的方法
当我构建我的项目时,我收到此错误:
The locationServiceComponent depends on more than one scoped
component: @Singleton NetComponent @Singleton RepositoryComponent
我理解我的LocationComponent不能依赖于两个@Singleton作用域组件,但我需要在我的服务中同时使用它们,并且都需要@Singleton.
做同样的事还有更好的选择吗?
解决方法
这意味着如果在Activity中初始化并保留NetComponent和RepositoryComponent,它将遵循该Activity的生命周期,并且不会真正成为应用程序单例.
因此,在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模块中提供的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。