如何从牙签中的相同模块传递依赖项的实例?

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

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客户端。

Interesting Posts