KoinというKotlin向けの依存性注入(Dependency Injection, DI)フレームワークを知ったので調べた
JavaのSpringと同様にアノテーションでDIを行っていく
主な特徴
- 軽量でシンプル:余計な設定や複雑なアノテーションを必要とせず、簡単に導入・利用可能
- Kotlin DSLを使用:Kotlinの関数やラムダ式を活用して依存関係を宣言するため、非常に可読性が高い
- Android対応:Androidアプリケーションでも使いやすく、ViewModelなどと統合して利用可能
基本的な使い方
1. 依存関係の定義
まず、Koinのmoduleを使用して依存関係を定義する
たとえば、MyRepositoryとMyServiceの依存関係を定義する場合
@Module class MyRepository @Module class MyService
val appModule = module { single { MyRepository() } single { MyService(get()) } // get() で登録するオブジェクトに依存するオブジェクトを取得 }
singleはシングルトンインスタンスを提供することを示すget()はKoinにネストされた依存関係を解決させるために使う
2. Koinの初期化
アプリケーションのonCreateやエントリーポイントでKoinを開始する
class MyApplication : Application() { override fun onCreate() { super.onCreate() startKoin { modules(appModule) // 定義したモジュールを渡す } } }
3. 依存関係の注入
Koinを使用して、依存関係を注入する
inject()関数を使うと、Koinが自動的に必要なインスタンスを提供する
class MyViewModel : ViewModel() { private val myService: MyService by inject() // 自動的に注入される }
Koinのスコープ
Koinでは、異なるスコープを使用して、ライフサイクルに基づいてオブジェクトを生成・管理できる
たとえば、factoryを使用すると、毎回異なるインスタンスを生成できる
val appModule = module { factory { MyRepository() } // 新しいインスタンスを毎回生成 }
テストでの使用
Koinはテストのサポートも充実していて、モックやスタブを簡単に設定できる
テスト環境で異なるモジュールを設定し、依存関係を注入できる
val testModule = module { single { MockRepository() as MyRepository } } @Test fun myTest() { startKoin { modules(testModule) } // テストロジック }