如何从Toothpick中的同一模块传递依赖项的实例?

时间:2017-10-29 18:07:26

标签: toothpick-di

假设我有一个模块,其中一个绑定依赖于另一个:

class MyModule : Module(){
  init {
    bind(SettingsStorage::class.java).to(PreferencesBasedSettingsStorage::class.java)
    // how to use createOkHttpClient here? 
    // how to get instance of SettingsStorage to pass to it?
    bind(OkHttpClient::class.java).to?(???)
  }

  private fun createOkHttpClient(settingsStorage: SettingsStorage): OkHttpClient {
    return OkHttpClient.Builder()
      .addNetworkInterceptor(MyInterceptor(settingsStorage))
      .build()
  } 
}

在这里,我可以创建OkHttpClient只有另一个绑定的实例,即SettingsStorage。但是怎么做呢?

目前我认为无法在模块中获取SettingsStorage绑定实例以将其传递给createOkHttpClient()

在Dagger中我会简单地用适当的参数创建两个提供者方法,比如

fun provideSessionStorage(/*...*/): SessionStorage { /* ... */ }

fun provideOkHttpclient(sessionStorage: SessionStorage): OkHttpClient {
   return OkHttpClient.Builder()
    .addNetworkInterceptor(MyInterceptor(settingsStorage))
    .build()
}

它会自行解决并将适当的sessionStorage实例传递给第二个提供者函数。

如何在Toothpick模块中实现相同的目标?

1 个答案:

答案 0 :(得分:2)

TP很简单:

class MyModule : Module(){
  init {
    bind(SettingsStorage::class.java).to(PreferencesBasedSettingsStorage::class.java)
    // how to use createOkHttpClient here? 
    // how to get instance of SettingsStorage to pass to it?
    bind(OkHttpClient::class.java).toProvider(OkHttpClientProvider::class)
  }
}

然后你定义了一个提供者(抱歉我不使用Kotlin):

class OkHttpClientProvider implements Provider<OkHttpClient> {
  @Inject SettingsStorage settingsStorage;
  public OkHttpClient get() {
     return OkHttpClient.Builder()
      .addNetworkInterceptor(MyInterceptor(settingsStorage))
      .build()
  }
}

您的提供商将使用第一个绑定来提供OkHttp客户端。