業務でAndroid開発にてKotlinを触ることになったので,せっかくだからKotlin純正のDIコンテナKodein
を触ってみることにしました,
簡単なGithubのリポジトリをリスト表示するサンプルアプリを作ったので,書き方と注意点を記録に残しておきます.
間違っているところもあるかもしれないので,ご意見ご指摘はあればどしどしお待ちしております.
Kodein is a very useful dependency retrieval container, it is very easy to use and configure.
KodeinのGithubページから引用.簡単に言うと
めっちゃ簡単にDI実現できるコンテナだよ
ということですね.
Kodeinは本当にシンプルで,追加のメソッドを生成しない,kaptを使用せずにDIコンテナを提供しています.
Androidのgradleに
dependencies {
implementation 'com.github.salomonbrys.kodein:kodein:4.1.0'
implementation 'com.github.salomonbrys.kodein:kodein-android:4.1.0'
}
を追記して,SyncすればKodeinが使えます.簡単:)
DIの定義は,Kodein {...}
ブロックに書きます.もしくは,Kodein.Module {...}
でも構いません.
各々書くべき場所は限定されていないので,ファイルを作成して直下に
fun networkModule() = Kodein.Module {
...
}
と定義しても構いません.今回は簡易のためApp.kt
にまるまる記述しました.
本丸のbindの記述ですが,以下のようになります.
Kodein.Module {
bind<Interceptor>() with instance(HttpLoggingInterceptor())
}
以上で,Intercepror
インスタンスのinjectが可能になります.
bind<T>
で型を指定する場合には,その型で参照することができるようになります.
上記のように,生成メソッドと期待する型が違う場合に便利です.
もし,withより右側で生成されるインスタンスの型をそのままinjectしたい場合は,もっと簡単に書くことができます.
Kodein.Module {
bind() from instance(HttpLoggingInterceptor()) // HttpLoggingInterceptorとして提供される
}
もし,提供したいインスタンスをSingletonに保ちたい場合には,
Kodein.Module {
bind<OkHttpClient>() with singleton { OkHttpClient.Builder().addNetworkInterceptor(HttpLogginInterceptor()).build()}
}
と書けばSingletonにできます.