何を言っているんだ?という感じなのだけど、KoinでRetrofitのClientクラスをシングルトンとして持たせようとした。
ただ、エンドポイントが複数あって、何個かのClientクラスをDIしないと行けない状態に。
ってことで何も考えずに以下みたいな感じで実装。
//
val ApiModule: Module = module {
single { HogeClient().setup(androidApplication()) }
single { (get() as Retrofit).create(HogeApi::class.java) }
single { HageApiClient().setup() }
single { (get() as Retrofit).create(HageApi::class.java) }
}
実行したらね、、、。
Caused by: org.koin.core.error.DefinitionOverrideException: Already existing definition for [Singleton:’retrofit2.Retrofit’] at retrofit2.Retrofit::_
って、言われて落ちたw
要は同じ型がシングルトンですでに設定してあるぜ!ってこと。
injectの際に、HogeなのかHageなのかどっちを取り出すかわからねぇよってことだよね。
で、解決方法。
//
val ApiModule: Module = module {
single(named("HogeClient")) { ApiClient().setup(androidApplication()) }
single { (get(named("HogeClient")) as Retrofit).create(HogeApi::class.java) }
single(named("HageApiClient")) { HageApiClient().setup() }
single { (get(named("HageApiClient")) as Retrofit).create(HageApi::class.java) }
}
各々にnamedで名前をつけてあげて、namedで取り出してあげるって感じ。
これで落ちなくなりました。
コメント