どっこと備忘録群

アウトプットしないとインプットできない私が Androidアプリ開発をメインとした備忘録を載せています。

Koinライブラリを扱う

KoinはDIをシンプルに導入できるライブラリ。 DI(Dependency Injection:依存性注入)は、クラスが依存するオブジェクトを外部から注入する設計パターンで、コードの疎結合化やテストの容易性が向上する。Koinは、設定の複雑なDaggerなどと比較して、非常に簡単に導入できるのが特長。

導入手順

  1. ライブラリの組み込み
  2. Applicationクラスの実装

1.ライブラリの組み込み

Koinライブラリをプロジェクトに追加する。app/build.gradle(またはapp/build.gradle.kt)のdependenciesに以下を記述する。

dependencies {
    // KoinのAndroid向け基本モジュール
    implementation("io.insert-koin:koin-android:3.4.2")
    // 必要に応じて、ViewModelやComposeなどのモジュールも追加します。
}

2.Applicationクラスの実装

アプリ起動時にKoinのセットアップを行うため、カスタムの**Application**クラスを実装する。

ここではDIしたいインターフェースとその実装クラス、および依存関係にある他のオブジェクト(例:RoomのDao)をKoinの**module**に登録する。

class SampleApplication : Application() {
    
    // 依存関係を定義するKoinモジュール
    private val appModule = module {
        // SampleRepositoryインターフェースに対して、SampleRepositoryImplを注入
        // SampleRepositoryImplのコンストラクタに必要な引数(get())はKoinが解決します
        single<SampleRepository> { SampleRepositoryImpl(get()) }
    }

    // RoomのDaoなど、他の依存関係もモジュールとして定義
    private val daoModule = module {
        single {
            // Roomデータベースのビルド処理を定義
            Room.databaseBuilder(
                androidContext(), // androidContext()でApplicationContextを取得
                Database::class.java,
                DATABASE_NAME
            ).build().dao()
        }
    }

    override fun onCreate() {
        super.onCreate()
        
        // Koinを起動し、モジュールを登録
        startKoin {
            androidContext(this@SampleApplication) // AndroidのContextを登録
            modules(appModule, daoModule)         // 定義したモジュールを登録
        }
    }
}

補足

  • **singleで登録すると、そのオブジェクトはアプリ内でシングルトン(単一のインスタンス)**として管理される。
  • **get()**は、Koinが管理している依存関係から、必要なインスタンスを解決して取得するように指示する。

各機能へのアクセス

DIしたいクラス(例:ActivityFragmentViewModelなど)では、**by inject()**デリゲートを使用して、必要なオブジェクトを簡単に注入(インジェクト)できる。

private val repository : SampleRepository by inject()
// これで、Koinに登録されたSampleRepositoryImplのインスタンスが利用可能になる

参考

最終更新: 2025.9.28