Kotlin Academy · Ders

KMP'de Koin ile Bağımlılık Enjeksiyonu

Çok platformlu bir kurulumda paylaşılan modülleri Koin kullanarak birbirine bağlayın.

4. ders / 414 adım

KMP'de Koin ile Bağımlılık Enjeksiyonu, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

KMP'de Neden DI Kullanılır

Bağımlılık Enjeksiyonu, bileşenlerin oluşturulmasını kullanımından ayırır. KMP'de Koin, saf Kotlin olduğu ve açıklama işlemcileri olmadan commonMain'de çalıştığı için tercih edilen DI çatısıdır.

// 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") }

Koin Modül DSL'i

module { } bloğunda single, factory veya scoped kullanarak bağlamaları tanımlayın.

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
}

commonMain'de Paylaşılan Modül

Paylaşılan bir Koin modülünü commonMain'de tanımlayın. Platform modülleri bunu platforma özgü bağlamalarla genişletir.

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

androidMain'de Platform Modülü

Platform modülleri gerçek HTTP altyapısını, veritabanı sürücüsünü ve Android'e özgü tekil nesneleri sağlar.

// 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())
}

Android Application'da startKoin

Android Application.onCreate içinde startKoin { } çağrısı yapın. Bağlamı kullanılabilir hâle getirmek için androidContext(this) kullanın.

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

iOS'ta Koin'i Başlatma

iOS'ta, paylaşılan Koin modüllerini geçirerek Swift AppDelegate veya App yapınızdan KoinApplication.start() çağrısı yapın.

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

Bağımlılıkları Çözümleme

commonMain ViewModels veya kullanım senaryolarında, modül içinde get() ya da çağrı noktalarında inject() / getKoin().get() kullanın.

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) }
}

ViewModels için Koin Kapsamları

Android ViewModels için Android modülünde viewModel { }, paylaşılan VM'ler için ise platformdan bağımsız factory { } kullanın.

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

Koin ile Test Etme

Gerçek bağımlılıkları sahteleriyle değiştiren bir test modülüyle test kurulumunda startKoin kullanın.

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()
}

Tekil ve Fabrika ve Kapsamlı

tekil: uygulamanın ömrü boyunca tek örnek. fabrika: her get() çağrısında yeni örnek. kapsamlı: her Koin kapsamı için bir örnek (örneğin ekran kapsamı).

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 ve El ile DI ve Hilt

Koin: çoklu platform desteği, KSP/KAPT yok, çalışma zamanı DI'si. Hilt: yalnızca Android, derleme zamanında çalışan ve açıklama tabanlı. El ile DI: en yüksek denetim, çatı ek yükü yok. KMP projeleri paylaşım için Koin kullanır.

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")
}

by inject() ile Ertelenmiş Enjeksiyon

by inject(), bir bağımlılığı ilk erişimde ertelenmiş olarak çözümler; KoinComponent uygulayan sınıflarda kullanışlıdır.

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)
}

Hızlı Kontrol

Her get() çağrıldığında yeni bir örnek oluşturan Koin kapsamı hangisidir?

Özet

Koin, açıklama işleme olmadan lambda DSL'i kullanır; bu da onu KMP için ideal kılar. Paylaşılan modülleri commonMain'de, platform modüllerini platform kaynak kümelerinde tanımlayın. Tekil örnekler için single, yeni örnekler için factory ve ertelenmiş çözümleme için by inject() kullanın.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Kotlin öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“KMP'de Koin ile Bağımlılık Enjeksiyonu” dersi ücretsiz mi?

Evet — “KMP'de Koin ile Bağımlılık Enjeksiyonu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“KMP'de Koin ile Bağımlılık Enjeksiyonu” dersinde ne öğreneceğim?

Çok platformlu bir kurulumda paylaşılan modülleri Koin kullanarak birbirine bağlayın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“KMP'de Koin ile Bağımlılık Enjeksiyonu” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. KMP Proje Yapısı: commonMain, androidMain, iosMain
  2. Platform API'leri için expect/actual Mekanizması
  3. Repository ve Use Case Katmanlarını Paylaşma
  4. KMP'de Koin ile Bağımlılık Enjeksiyonu
← Kotlin Academy Sayfasına Dön