0Pricing
Kotlin Academy · Leçon

Injection de dépendances dans KMP avec Koin

Reliez les modules partagés avec Koin dans une configuration multiplateforme.

Injection de dépendances dans KMP avec Koin est une leçon Kotlin Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Kotlin Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Kotlin Academy comprend 4 leçons au total.

Pourquoi utiliser la DI dans KMP ?

L'injection de dépendances découple la création des composants de leur utilisation. Dans KMP, Koin est le framework de DI privilégié, car il est écrit en Kotlin pur et fonctionne dans commonMain sans processeurs d'annotations.

// No annotation processing needed — Koin uses lambda DSL
// Add to build.gradle.kts:
// implementation("io.insert-koin:koin-core:3.5.0")
// androidMain: koin-android
// iosMain: no extra dep
fun main() { println("Koin works on all KMP targets") }

DSL des modules Koin

Définissez les liaisons dans un bloc module { } à l'aide de single, factory ou scoped.

import org.koin.core.module.dsl.*
import org.koin.dsl.*
val appModule = module {
    single { HttpClient() }               // one instance
    single<UserRepository> { RemoteUserRepository(get()) }
    factory { GetUserUseCase(get()) }      // new instance each time
}

Module partagé dans commonMain

Définissez un module Koin partagé dans commonMain. Les modules propres aux plateformes l'étendent avec des liaisons spécifiques à celles-ci.

// commonMain/di/SharedModule.kt
import org.koin.dsl.module
fun sharedModule() = module {
    single<UserRepository> { RemoteUserRepository(get()) }
    single { GetUserUseCase(get()) }
    single { UserViewModel(get()) }
}

Module de plateforme dans androidMain

Les modules propres aux plateformes fournissent le moteur HTTP concret, le pilote de base de données et les instances uniques spécifiques à Android.

// androidMain/di/AndroidModule.kt
import io.ktor.client.engine.okhttp.*
import org.koin.dsl.module
fun androidModule() = module {
    single { OkHttp.create() }    // Ktor engine
    single { createHttpClient(get()) }
    includes(sharedModule())
}

startKoin dans l'application Android

Appelez startKoin { } dans votre Application.onCreate Android. Utilisez androidContext(this) pour rendre le contexte disponible.

// androidMain:
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
// In Application.onCreate():
startKoin {
    androidContext(this@MyApp)
    modules(androidModule())
}

Démarrer Koin sur iOS

Sur iOS, appelez KoinApplication.start() depuis votre AppDelegate Swift ou votre structure App, en transmettant les modules Koin partagés.

// iosMain/KoinInit.kt:
import org.koin.core.context.startKoin
fun initKoin() {
    startKoin {
        modules(iosModule())
    }
}
// Swift: KoinInitKt.doInitKoin() in AppDelegate

Résoudre les dépendances

Dans les ViewModels ou les cas d'utilisation de commonMain, utilisez get() à l'intérieur d'un module ou inject() / getKoin().get() aux points d'appel.

import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class UserViewModel : KoinComponent {
    private val getUser: GetUserUseCase by inject()
    fun load(id: String) = runBlocking { getUser(id) }
}

Portées Koin pour les ViewModels

Utilisez viewModel { } dans le module Android pour les ViewModels Android, ou la factory { } indépendante de la plateforme pour les VM partagés.

// androidMain (with koin-android):
import org.koin.androidx.viewmodel.dsl.viewModel
val androidVmModule = module {
    viewModel { UserViewModel(get()) }
}
// In Compose:
// val vm: UserViewModel = koinViewModel()

Tests avec Koin

Utilisez startKoin dans la configuration des tests avec un module de test qui remplace les dépendances réelles par des doublures.

import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin
import org.koin.dsl.module
class UserViewModelTest {
    @BeforeTest fun setup() {
        startKoin { modules(module {
            single<UserRepository> { FakeUserRepository() }
            single { GetUserUseCase(get()) }
        })}
    }
    @AfterTest fun teardown() = stopKoin()
}

Comparaison de single, factory et scoped

single : une instance pendant toute la durée de vie de l'application. factory : une nouvelle instance à chaque get(). scoped : une instance par portée Koin (par exemple, la portée d'un écran).

import org.koin.dsl.module
val lifetimeModule = module {
    single { Database() }           // shared, one instance
    factory { Analytics() }         // new on each get()
    scope<ScreenScope> {
        scoped { ScreenViewModel() } // one per screen lifecycle
    }
}

Koin, DI manuelle ou Hilt

Koin : multiplateforme, sans KSP ni KAPT, avec une DI à l'exécution. Hilt : réservé à Android, à la compilation et fondé sur les annotations. DI manuelle : contrôle maximal, sans surcharge d'infrastructure. Les projets KMP utilisent Koin pour le partage.

fun main() {
    // Koin  : commonMain, runtime, lambda DSL
    // Hilt  : androidMain only, compile-time
    // Manual: no framework, explicit wiring in factory/module files
    println("Choose Koin for KMP; Hilt for Android-only projects")
}

Injection différée avec by inject()

by inject() résout une dépendance à la première utilisation, ce qui est utile dans les classes qui implémentent KoinComponent.

import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class AppService : KoinComponent {
    private val repo: UserRepository by inject()  // resolved on first use
    fun doWork() = println(repo.javaClass.simpleName)
}

Vérification rapide

Quelle portée Koin crée une nouvelle instance chaque fois que get() est appelé ?

Récapitulatif

Koin utilise une DSL fondée sur les lambdas, sans traitement des annotations, ce qui est idéal pour KMP. Définissez les modules partagés dans commonMain et les modules propres aux plateformes dans les ensembles de sources correspondants. Utilisez single pour les instances uniques, factory pour les nouvelles instances et by inject() pour la résolution différée.

Questions Fréquemment Posées

La leçon « Injection de dépendances dans KMP avec Koin » est-elle gratuite ?

Oui — le texte complet de « Injection de dépendances dans KMP avec Koin » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Kotlin Academy, passe à CoddyKit PRO. Le cours Kotlin Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Injection de dépendances dans KMP avec Koin » ?

Reliez les modules partagés avec Koin dans une configuration multiplateforme. Tu pratiques Kotlin Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Kotlin Academy ?

Aucune expérience préalable n'est requise. Kotlin Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Injection de dépendances dans KMP avec Koin » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Kotlin Academy ?

Oui. Chaque leçon Kotlin Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Structure d’un projet KMP : commonMain, androidMain, iosMain
  2. Mécanisme expect/actual pour les API de plateforme
  3. Partager les couches de dépôt et de cas d’utilisation
  4. Injection de dépendances dans KMP avec Koin
← Retour à Kotlin Academy