我有2个Retrofit客户端,其中一个默认,第二个有不同的实现,如(基本URL,拦截器等…)
我需要注入默认客户端而不使用名称引用
第一位客户: –
single<Retrofit> {
Retrofit.Builder()
.baseUrl(RemoteConstants.BASE_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(APIResponseConverter())
.addConverterFactory(GsonConverterFactory.create(get()))
.client(get())
.build()
}
第二位客户: –
single<Retrofit>("retrofit_second") {
Retrofit.Builder()
.baseUrl("diffrent url")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(get()))
.client(get("SecondOkHttpClient"))
.build()
}
我的注射方式
val myModule = module {
factory { get<Retrofit>().create(FirstAPI::class.java) } // Why Koin did not figure it without providing its default name !?
factory { get<Retrofit>("retrofit_second").create(SecondAPI::class.java) }
factory<IMyRemoteDataSource> { MyRemoteDataSource(get(), get()) }
factory<IMyRepository> { MyRepository(get()) }
factory { MyUseCase(get()) }
}
结果是:
Multiple definitions found for type 'class retrofit2.Retrofit' - Koin can't choose between :
Single [name='retrofit_second',class='retrofit2.Retrofit']
Single [name='Retrofit',class='retrofit2.Retrofit']
为什么Koin没有提供默认名称(Retrofit)就没有获得默认的Retrofit实例!
factory { get<Retrofit>().create(FirstAPI::class.java) }
最佳答案 你是对的@Eslam.当前行为(从koin:1.0.2开始)是指未指定依赖项名称时,它是
treated作为空字符串.
then定义按类名获得
filtered:
fun searchByClass(clazz: KClass<*>): List<BeanDefinition<*>> {
return definitions.filter { clazz in it.classes }
}
因此,您将获得两个定义,从而导致上述错误:类的多个定义….