3

あるバインディングが別のバインディングに依存するモジュールがあるとします。

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 では、次のような適切な引数を持つ 2 つのプロバイダー メソッドを単純に作成します。

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

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

そして、それ自体ですべてを把握し、sessionStorage の適切なインスタンスを 2 番目のプロバイダー関数に渡します。

Toothpick モジュール内で同じことを達成するにはどうすればよいですか?

4

1 に答える 1

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 クライアントを提供します。

于 2017-10-31T08:45:49.720 に答える