[Android]KolinのDIで同じ型クラスをシングルトンとして持たせる

何を言っているんだ?という感じなのだけど、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で取り出してあげるって感じ。

これで落ちなくなりました。

コメント

タイトルとURLをコピーしました