Dependency injection in KMP con Koin
Colleghi i moduli condivisi usando Koin in una configurazione multipiattaforma.
Dependency injection in KMP con Koin è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.
Perché usare la DI in KMP?
La Dependency Injection disaccoppia la creazione dei componenti dal loro utilizzo. In KMP, Koin è il framework DI di riferimento perché è scritto in Kotlin puro e funziona in commonMain senza processori di annotazioni.
// 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 dei moduli Koin
Definisca i binding in un blocco module { } utilizzando single, factory o 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
}Modulo condiviso in commonMain
Definisca un modulo Koin condiviso in commonMain. I moduli della piattaforma lo estendono con binding specifici della piattaforma.
// commonMain/di/SharedModule.kt
import org.koin.dsl.module
fun sharedModule() = module {
single<UserRepository> { RemoteUserRepository(get()) }
single { GetUserUseCase(get()) }
single { UserViewModel(get()) }
}Modulo della piattaforma in androidMain
I moduli della piattaforma forniscono il motore HTTP effettivo, il driver del database e i singleton specifici di 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 nell'Application Android
Chiami startKoin { } nel metodo Application.onCreate dell'applicazione Android. Utilizzi androidContext(this) per rendere disponibile il contesto.
// androidMain:
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
// In Application.onCreate():
startKoin {
androidContext(this@MyApp)
modules(androidModule())
}Avviare Koin su iOS
Su iOS, chiami KoinApplication.start() dal suo AppDelegate Swift o dalla struct App, passando i moduli Koin condivisi.
// iosMain/KoinInit.kt:
import org.koin.core.context.startKoin
fun initKoin() {
startKoin {
modules(iosModule())
}
}
// Swift: KoinInitKt.doInitKoin() in AppDelegateRisoluzione delle dipendenze
Nei ViewModel o nei casi d'uso di commonMain, utilizzi get() all'interno di un modulo oppure inject() / getKoin().get() nei punti di chiamata.
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) }
}Scope Koin per i ViewModel
Utilizzi viewModel { } nel modulo Android per i ViewModel Android oppure il factory { } indipendente dalla piattaforma per i VM condivisi.
// androidMain (with koin-android):
import org.koin.androidx.viewmodel.dsl.viewModel
val androidVmModule = module {
viewModel { UserViewModel(get()) }
}
// In Compose:
// val vm: UserViewModel = koinViewModel()Test con Koin
Utilizzi startKoin nella configurazione dei test con un modulo di test che sostituisca le dipendenze reali con componenti fittizi.
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()
}Single vs Factory vs Scoped
single: una sola istanza per tutta la durata dell'applicazione. factory: una nuova istanza per ogni chiamata a get(). scoped: una sola istanza per ogni scope Koin (ad esempio, lo scope di una schermata).
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 vs DI manuale vs Hilt
Koin: multiplatform, senza KSP/KAPT, DI a runtime. Hilt: solo Android, in fase di compilazione, basato sulle annotazioni. DI manuale: massimo controllo, nessun overhead del framework. I progetti KMP utilizzano Koin per condividere il codice.
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")
}Iniezione lazy con by inject()
by inject() risolve una dipendenza in modo lazy al primo accesso; è utile nelle classi che implementano 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)
}Verifica rapida
Quale scope Koin crea una nuova istanza ogni volta che viene chiamato get()?
Riepilogo
Koin utilizza una DSL basata su lambda senza elaborazione delle annotazioni, ideale per KMP. Definisca i moduli condivisi in commonMain e i moduli della piattaforma nei source set della piattaforma. Utilizzi single per i singleton, factory per le nuove istanze e by inject() per la risoluzione lazy.
Impara Kotlin con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 51
- Lezioni
- 203
Domande Frequenti
La lezione «Dependency injection in KMP con Koin» è gratuita?
Sì — il testo completo di «Dependency injection in KMP con Koin» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.
Cosa imparerò in «Dependency injection in KMP con Koin»?
Colleghi i moduli condivisi usando Koin in una configurazione multipiattaforma. Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Kotlin Academy?
Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Dependency injection in KMP con Koin»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?
Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Struttura di progetto KMP: commonMain, androidMain, iosMain
- Meccanismo expect/actual per le API di piattaforma
- Condividere i livelli Repository e Use Case
- Dependency injection in KMP con Koin