如何从牙签中的相同模块传递依赖项的实例?
假设我有一个模块,其中一个绑定依赖于另一个:
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()
在匕首,我会简单地创建两个提供者方法,如适当的参数
fun provideSessionStorage(/*...*/): SessionStorage { /* ... */ } fun provideOkHttpclient(sessionStorage: SessionStorage): OkHttpClient { return OkHttpClient.Builder() .addNetworkInterceptor(MyInterceptor(settingsStorage)) .build() }
它会自行计算出来,并将适当的sessionStorage实例传递给第二个提供者函数。
如何在牙签模块中实现同样的function?
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 { @Inject SettingsStorage settingsStorage; public OkHttpClient get() { return OkHttpClient.Builder() .addNetworkInterceptor(MyInterceptor(settingsStorage)) .build() } }
您的提供商将使用第一个绑定来提供OkHttp客户端。