gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:07:18 27 4
gpt4 key购买 nike

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

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()
}
}

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

目前我看不出有什么方法可以在模块中获取 SettingsStorage 绑定(bind)的实例以将其传递给 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()
}
}

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

关于toothpick-di - 如何从 Toothpick 中的同一模块传递依赖实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47003529/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com