【モバイルアプリ2026 #10】Dependency Injectionについて

💡
この章で話すこと
  • Dependency Injectionとは
  • Dependency Inversion Principle とは
  • Hiltとは

Dependency Injection (依存性の注入)とは

Dependency Injection(DI)とは、
あるクラスが依存するオブジェクトを「自分で作らず、外から渡してもらう」設計手法のことです。

❌ DIしない例(ViewModelが自分でRepositoryを生成)

class MyViewModel {

private val repository = UserRepository() // 自分で生成 → 密結合

}

✅ DIした例(外部から注入)

class MyViewModel(

private val repository: UserRepository // コンストラクタで受け取る

)

こうすることで、ViewModel は Repository の具体的な作り方を知らなくてよくなり、テスト時にはモックを差し替えられるなどの利点があります。

DIのメリット

  • クラスの再利用性の向上
  • 依存関係の分離
  • テストの容易性の向上

Dependency Inversion Principle(DIP, 依存関係逆転の原則)とは

Dependency Inversion Principle(DIP)とは

上位のクラスが下位の具体クラスに直接依存するのではなく、
両者が「抽象(interface)」を介してやり取りするようにする原則。
呼び出す側は「結果」さえ得られればよく、内部の実装方法は知らなくてよい状態を目指す。

❌ DIP違反(具体クラスに依存している)

// ViewModel が具体的な実装クラスに直接依存

class MyViewModel(

private val repository: UserRepositoryImpl // 実装クラスに依存

)

✅ DIPに従った例(抽象に依存)

// 抽象(interface)を定義

interface UserRepository {
	suspend fun fetchUser(): User
}

// 実装はインターフェースを満たす

class UserRepositoryImpl : UserRepository { ... }
class FakeUserRepository : UserRepository { ... } // テスト用

// ViewModel は interface にだけ依存
class MyViewModel(

private val repository: UserRepository // 抽象に依存

)

こうすると ViewModel は fetchUser() を呼べば User が返ってくることだけを知っていればよく、実際にAPIを叩くのか、DBから取るのか、テスト用のダミーなのかは関係なくなる。

Androidでの実装方法

AndroidではHiltを使うことでボイラープレートを削減でき簡単に実現できます。

💡
KSP について

Hiltのアノテーション処理には従来 kapt(Kotlin Annotation Processing Tool)が使われていましたが、現在はより高速なKSP(Kotlin Symbol Processing)への移行が推奨されています。KSPはkaptと比べてビルド速度が最大2倍向上します。Hiltは2024年以降KSPを正式サポートしており、新規プロジェクトではKSPの使用が推奨です。

今回のハンズオン用リポジトリでもKSPを利用しています。

自力実装の例: