如何从 Toothpick 中的同一模块传递依赖实例?
How to pass instance of the dependency from a same module in Toothpick?
假设我有一个模块,其中一个绑定依赖于另一个:
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 模块中实现同样的功能?
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 客户端。
假设我有一个模块,其中一个绑定依赖于另一个:
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 模块中实现同样的功能?
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 客户端。