单例组件不能依赖于范围组件

时间:2017-02-22 09:31:42

标签: android dagger-2

在使用dagger2处理依赖注入的android应用程序时,在定义dagger组件时我收到此错误

Error:(13, 1) error: This @Singleton component cannot depend on scoped components:
@Singleton com.eaxample.app.DaggerAndroid.networkhandler.WebserviceComponent

我的组件代码在这里:

@Singleton
@Component(modules = {WebserviceModule.class}, dependencies = {ApplicationComponent.class})
public interface WebserviceComponent {
      WebserviceHelper providesWebserviceHelper();
}

我遇到错误的成分代码是:

@Singleton
@Component(modules = {RemoteDataModule.class}, dependencies = {WebserviceComponent.class})
public interface RemoteDataSourceComponent {
       RemoteDataSource providesRemoteDataSource();
}

为什么会出现此错误以及如何解决此问题。

3 个答案:

答案 0 :(得分:7)

WebserviceComponentRemoteDataSourceComponent不能具有相同的范围。在匕首2中,范围定义类似于生命周期,@Singleton是最宽的。因此,如果RemoteDataSourceComponent取决于WebserviceComponent,则表示WebserviceComponent可以延长使用时间。

答案 1 :(得分:6)

虽然dmitriyzaitsev的答案说明了为什么会出现错误,但可以通过以下方法解决它:

  1. 定义您自己的作用域(它实际上也将像Singleton作用域一样)。例如。名为RemoteDataScope.java的文件:

    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    public @interface RemoteDataScope {
    }
    
  2. 使用新作用域,例如@RemoteDataScope中的@Singleton而不是RemoteDataSourceComponent

    @RemoteDataScope
    @Component(modules = {RemoteDataModule.class}, dependencies = {WebserviceComponent.class})
    public interface RemoteDataSourceComponent {
           RemoteDataSource providesRemoteDataSource();
    }
    

答案 2 :(得分:2)

另一种解决方案(不定义额外的作用域)是使用“常规”(未注释)接口分离两个组件。

在您的情况下,请说WebService

public interface WebService {
    WebserviceHelper providesWebserviceHelper();
}

使WebserviceComponent扩展WebService

@Singleton
@Component(modules = {WebserviceModule.class}, dependencies = {ApplicationComponent.class})
public interface WebserviceComponent extends WebService {
    // empty body now
}

WebserviceComponent的{​​{1}}替换为WebService的依存关系:

RemoteDataSourceComponent