Dependency Injection (Koin) в Android/KMM-додатку
Koin — DI-фреймворк на Kotlin DSL без кодогенерації. Підходить там, де Dagger/Hilt надлишковий: невеликі-середні додатки, KMM-проекти де потрібен спільний DI для Android та iOS, команди, яким не потрібен kapt або KSP в збірці.
Базове налаштування
// build.gradle.kts
implementation("io.insert-koin:koin-android:3.5.0")
implementation("io.insert-koin:koin-androidx-viewmodel:3.5.0")
Модуль залежностей:
val appModule = module {
single<UserRepository> { UserRepositoryImpl(get()) }
single { ApiService(get()) }
factory { AuthUseCase(get()) }
viewModel { LoginViewModel(get()) }
}
single — синглтон на час життя Koin-контейнера. factory — новий інстанс при кожному запиті. viewModel — створює ViewModel та реєструє в ViewModelStore.
Ініціалізація в Application:
class App : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@App)
modules(appModule)
}
}
}
У Fragment або Activity:
val viewModel: LoginViewModel by viewModel()
val repository: UserRepository by inject()
Koin в KMM
У Kotlin Multiplatform Koin дозволяє оголосити спільні залежності в commonMain та платформені — в androidMain / iosMain:
// commonMain
val commonModule = module {
single { UserSyncService(get()) }
factory { SyncUseCase(get()) }
}
// androidMain
val androidModule = module {
single<DatabaseDriver> { AndroidSqliteDriver(Database.Schema, androidContext(), "app.db") }
}
// iosMain
val iosModule = module {
single<DatabaseDriver> { NativeSqliteDriver(Database.Schema, "app.db") }
}
На iOS Koin ініціалізується через KoinApplication:
// Swift
KoinKt.doInitKoin(appDeclaration: { _ in })
Це головна перевага перед Hilt: Hilt — Android-only, Koin працює в shared-коді.
Типова помилка
NoBeanDefFoundException в рантаймі — Koin не знайшов біндинг для запрошеного типу. Причина: забули додати модуль при startKoin, або тип в inject<T>() не збігається з тим, що зареєстровано (interface vs implementation). На відміну від Dagger, помилка проявляється не при збірці, а при першому зверненню до залежності. Для раннього виявлення — checkModules() в тестах:
@Test
fun verifyKoinApp() {
koinApplication {
modules(appModule)
}.checkModules()
}
Налаштування Koin для Android-проекту — 0.5–1 день. Для KMM з кількома платформними модулями — 2–3 дні. Вартість розраховується індивідуально.







