Dagger 2:避免导出私有依赖项

时间:2017-04-07 07:52:50

标签: java android dependency-injection dagger-2 dagger

假设我有一个模块,我只想导出A的实例。但是,此A要求BC的实例在构造函数中传递。所以我们也会在模块中声明它们:

public class SampleModule {

    @Provides
    @Singleton
    A provideA(B b, C c){
        return new A(b, c);
    }

    @Provides
    @Singleton
    B provideB(){
        return new B();
    }

    @Provides
    @Singleton
    C provideC(){
        return new C(); 
    }
}

这样做有效,但现在代码中的其他地方也可以使用BC。我希望将它们保密,并强制客户端类只能访问A

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:5)

实现该目标的最简单方法是将您不希望提供的类型(在本例中为BC)与@Qualifier绑定在一起无法访问。

然后,虽然可以从模块外部访问BC,但为了注入它们,您需要提供限定符,而不是。

@Module
public final class SampleModule {
  @Qualifier
  @Retention(RUNTIME)
  private @interface SampleModuleOnly {}

  @Provides
  @Singleton
  static A provideA(@SampleModuleOnly B b, @SampleModuleOnly C c){
    return new A(b, c);
  }

  @Provides
  @SampleModuleOnly 
  @Singleton
  static B provideB(){
    return new B();
  }

  @Provides
  @SampleModuleOnly 
  @Singleton
  static C provideC(){
    return new C(); 
  }
}

答案 1 :(得分:0)

一个简单的方法是

@Retention(BINARY)
@Qualifier
private annotation class InternalApi

@Module
object NetworkModule {
  @Provides 
  @InternalApi 
  fun provideClient(): OkHttpClient {
    //...
  }

  @Provides
  fun provideRetrofit(
    @InternalApi client: Lazy<OkHttpClient>
  ): Retrofit {
    //...
  }
}

here中剔除。

基本上,我们创建私有限定符-在这种情况下,@InternalApi用于限定OkHttpClient依赖关系,从而使其对我们的模块私有。