インターンなどに参加し,DIの勉強の必要性に駆られたため,ここにメモを残します.あなかしこ.
前提: なぜDIが必要なのか[1][2]
- 複数箇所で同じクラスのインスタンスを使うとき
- 同じ生成コードを複数書く必要がある.
- 一つのオブジェクトの中で,他のオブジェクトをインスタンス化すると.
- 生成元は,生成先を知る必要があるから依存性が高くなる.
- 単体テストができなくなる場合がある.
MVVMの場合
- Viewは,ViewModelの生成方法(依存関係)を知る必要がある.
- ViewModelは,Modelの生成方法を知る必要がある.
ということらしい
理解を深めるために,実際にアプリを作ってみようというところ.
はじめに
アプリ開発上の参考資料
DIを利用している参考資料(サンプルアプリ)がないか探した結果...
-
Jetpack ComposeによるAndroid MVVMアーキテクチャ入門 [1].
こちらはMVVMアーキテクチャの理解を目的とした参考書である.
しかし,アプリの実装の際に,HiltによるDIの実装と解説も行っているため,これを利用.
自身の判断による実装の変更点
上記の書籍の発行時はJetpack Composeがベータ版である,ライブラリのCompose対応が出揃っていないなどの問題があった.これらは,Android Architecture Blueprints,開発者ドキュメントを参考にできるだけ新しい実装ができるようにした[3].
命名や,実装方法など自身の理解がしやすいように変更している場所がある(問題はないようにしているつもり).
開発環境
- Windows 11 21H2 build 22000.978
- Android Studio Dolphin | 2021.3.1
アプリ概要
- 入力されたGithubのusernameから,プロフィール画像,名前などを取得する.
- データの取得には,GitHubApiを用いる.
- MVVM + Repository
- UIはJetpack Compose
HiltによるDIの実装
Application
@HiltAndroidApp
を記述
このアプリがHiltを使うことを教えてあげる.
@HiltAndroidApp
class GithubApplication: Applicatoin()
Activity
ActivityやFragmentには@AndroidEntryPoint
を記述する.
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
...
}
ViewModel
@HiltViewModel
をつけてHiltに教える.
@Inject
をコンストラクタにつけて,Hiltにオブジェクトの作り方を教える.
@HiltViewModel
class MainViewModel @Inject constructor(
...
): ViewModel() {
...
}
Implement Class
実装クラスです(例はRepository).
@Inject
を記述して,Hiltにオブジェクトの作り方を教える.
class UserRepositoryImpl @Inject constructor(
...
): UserRepository {
...
}
Module Class
モジュールクラスです(例はRepository).
@Module
でHiltのモジュールとする.
@InstallIn(ViewModelComponent::class)
を記述して,ViewModelのライフサイクルとする.
@Provides
を記述して,インスタンスを生成する方法を知らせる.
@Module
@InstallIn(ViewModelComponent::class)
class UserRepositoryModule {
@Provides
fun provideUserRepository(userRepositoryImpl: UserRepositoryImpl): UserRepository{
return userRepositoryImpl
}
}
と言った具合.
詳しい実装内容は,https://github.com/M0710Fa/GithubApp にある.
終わりに
勉強の備忘録として記述しました,理解が足りない部分があるかもしれないです.
DIの勉強の必要性に駆られて書きました.
開発をしていて,DIの必要性に駆られたことがまだないので,深い理解という意味ではまだまだかなと感じます.
これは,自身がテストをまともに書いたことがないことが理由の一つだと考えられます.
今後は,テストコードついての知見を深めて行きたい所存です.
参考文献
[1] 奥澤 俊樹,Jetpack ComposeによるAndroid MVVMアーキテクチャ入門
https://nextpublishing.jp/book/13660.html
[2] Kazuki Ota,DI (依存性注入) って何のためにするのかわからない人向けに頑張って説明してみる,Qiita
https://qiita.com/okazuki/items/a0f2fb0a63ca88340ff6
[3] android/architecture-samples, Android Architecture Blueprints
https://github.com/android/architecture-samples
[4] Android Developers, Hilt を使用した依存関係の注入
https://developer.android.com/training/dependency-injection/hilt-android?hl=ja
[5] Manuel Vivo, Hilt and Dagger annotations cheat sheet, Medium
https://medium.com/androiddevelopers/hilt-and-dagger-annotations-cheat-sheet-9adea070e495