Androidプロジェクトに新規参加することになり、
利用されているDependency Injection(以下、DI)について調査しました。
プロジェクトで使われているDIがなぜ選択されたのか、
他との比較をした上で良い点、悪い点も把握するため調査した内容になります。
DIとは?
依存性の注入
、依存関係インジェクション
と表記されます。
依存関係インジェクション(DI)はプログラミングで広く使用されている手法で、Android 開発にも適しています。
DI の原則に従うことで、優れたアプリ アーキテクチャの土台を築くことができます。
依存関係インジェクションを実装すると、次のようなメリットがもたらされます。
・コードを再利用できる
・リファクタリングが容易になる
・テストが容易になる
引用:https://developer.android.com/training/dependency-injection?hl=ja
Android DI フレームワーク一覧
- ★Dagger
- ★Hilt
- ★Koin
- Kodein
- Katana
- RoboGuice
- Proton
調べたところ多数見つけることが出来ましたので絞って更に調査を行うことにしました。
ただしDaggerとHiltはAndroid Developersに記載されている為、無条件で対象とします。
更新状況 | スター数 | |
---|---|---|
Koin | 継続中 | 7k |
Kodein | 継続中 | 2.6k |
Katana | 継続中 | 180 |
RoboGuice | 最終更新2016年 | - |
Proton | 最終更新2014年 | - |
Dagger
- Java、Kotlin、Android 向けの完全に静的なコンパイル時依存性注入フレームワークになります。
- 元々はSquare社が開発したものをGoogleがforkした形になります。
- この時に呼び名が変わっており、明確にはSquare社のv0.9.0~1.2.1をDagger、
- Googleのv2.0.0~v2.3.6をDagger2と呼ばれています。
- 導入方法についてはAndroid Developersに記載されています。
- ただし現在(2021年10月)はHiltの方を推奨しているようです。
Hilt
-
HiltはAndroid Dev Summit 2019にて発表されました。
-
2020年5月にalphaバージョン、2021年5月に1.0.0がリリースされています。
-
HiltはDaggerの上に構築されているため下記のDaggerの恩恵を受けられます。
- コンパイル時の正確性
- 実行時のパフォーマンス
- スケーラビリティ
- Android Studioのサポート
-
こちらも導入方法についてはAndroid Developersに記載されています。
Koin
- Kotlin開発者向けの実用的で軽量な依存性注入フレームワークになります。
- Android Kotlinだけではなく、Android Java、Ktorでも利用可能です。
- 使い方がかなり簡易であり以下の操作で使うことが出来ます。
- injectしたいモジュールの宣言
- Koinの開始
- 利用箇所でinject
Koinを使ってみて
Android DIへの入りとして学習コストが易しそうなKoinを触ってみました。
以下サンプルではActivityにViewModelを注入する事としました。
まずはViewModelの定義を行います。
このViewModelでは2つのUseCaseを利用するので定義します。
internal class SampleViewModel(
private val hogeUseCase: HogeUseCase,
private val fugaUseCase: FugaUseCase
)
次にViewModelを注入する為、モジュールに定義します。
この時、依存関係のネストである2つのUseCaseは明確に定義する必要がなく、
get()
のみで判別してくれる為大変楽でした。
val myModule = module {
viewModel { SampleViewModel(get(), get()) }
}
次に定義したモジュールをKoinに読み込ませます。
読み込ませるにはKoinを開始する時に定義するだけで大丈夫です。
startKoin {
androidContext(this@App)
modules(myModule)
}
最後にViewModelを利用する箇所でViewModelを注入します。
private val sampleViewModel: SampleViewModel by viewModel()
わずか数行で依存性の注入を実装することが出来ました。
また、Daggerのようなアノテーションベースではない為大変分かりやすかったです。
まとめ
- 現在選択肢に上がるのはHiltかKoin。
- ただしAndroid Developersで推している為、スタンダードはHilt。
- 以下コストから(個人的に)Koinも選択肢として有り。
- 導入のしやすさ
- 記述の見やすさ
- 学習コスト
参考
https://developer.android.com/?hl=ja
https://insert-koin.io/