Kotlin Academy · पाठ

Koin के साथ KMP में Dependency Injection

Multiplatform setup में Koin का उपयोग करके shared modules को आपस में जोड़ें।

पाठ 4, कुल 4 में से14 चरण

Koin के साथ KMP में Dependency Injection, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

KMP में DI क्यों?

Dependency Injection, कॉम्पोनेंट बनाने की प्रक्रिया को उनके उपयोग से अलग करता है। KMP में Koin पसंदीदा DI फ्रेमवर्क है, क्योंकि यह शुद्ध Kotlin है और annotation processors के बिना commonMain में काम करता है।

// 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 Module DSL

module { } ब्लॉक में single, factory या scoped का उपयोग करके bindings परिभाषित करें।

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 में साझा मॉड्यूल

commonMain में साझा Koin मॉड्यूल परिभाषित करें। प्लेटफ़ॉर्म मॉड्यूल प्लेटफ़ॉर्म-विशिष्ट bindings के साथ इसका विस्तार करते हैं।

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

androidMain में प्लेटफ़ॉर्म मॉड्यूल

प्लेटफ़ॉर्म मॉड्यूल वास्तविक HTTP इंजन, डेटाबेस ड्राइवर और 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())
}

Android Application में startKoin

अपने Android Application.onCreate में startKoin { } कॉल करें। कॉन्टेक्स्ट उपलब्ध कराने के लिए androidContext(this) का उपयोग करें।

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

iOS पर Koin शुरू करना

iOS पर, साझा Koin मॉड्यूल पास करते हुए अपने Swift AppDelegate या App स्ट्रक्चर से KoinApplication.start() कॉल करें।

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

निर्भरताएँ प्राप्त करना

commonMain ViewModels या उपयोग-मामलों में, मॉड्यूल के भीतर get() या कॉल साइट पर inject() / getKoin().get() का उपयोग करें।

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 के लिए Koin स्कोप

Android ViewModels के लिए Android मॉड्यूल में viewModel { } का उपयोग करें, या साझा VMs के लिए प्लेटफ़ॉर्म-स्वतंत्र factory { } का उपयोग करें।

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

Koin के साथ परीक्षण

परीक्षण सेटअप में startKoin का उपयोग करें और ऐसे परीक्षण मॉड्यूल से वास्तविक निर्भरताओं को नकली निर्भरताओं से बदलें।

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 बनाम Factory बनाम Scoped

single: ऐप के पूरे जीवनकाल के लिए एक इंस्टेंस। factory: प्रत्येक get() पर नया इंस्टेंस। scoped: प्रत्येक Koin स्कोप के लिए एक इंस्टेंस (जैसे स्क्रीन स्कोप)।

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 बनाम Manual DI बनाम Hilt

Koin: मल्टीप्लेटफ़ॉर्म, KSP/KAPT के बिना, रनटाइम DI। Hilt: केवल Android के लिए, संकलन-समय पर, annotation-आधारित। Manual DI: अधिकतम नियंत्रण, बिना फ्रेमवर्क ओवरहेड के। KMP प्रोजेक्ट साझा करने के लिए Koin का उपयोग करते हैं।

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() के साथ विलंबित इंजेक्शन

by inject() पहली बार पहुँच होने पर निर्भरता को विलंब से प्राप्त करता है — यह 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)
}

त्वरित जाँच

हर बार get() कॉल किए जाने पर कौन-सा Koin स्कोप नया इंस्टेंस बनाता है?

पुनरावलोकन

Koin बिना annotation processing के lambda DSL का उपयोग करता है — KMP के लिए आदर्श। साझा मॉड्यूल commonMain में और प्लेटफ़ॉर्म मॉड्यूल प्लेटफ़ॉर्म स्रोत सेट में परिभाषित करें। सिंगलटन के लिए single, नए इंस्टेंस के लिए factory और विलंबित समाधान के लिए by inject() का उपयोग करें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “Koin के साथ KMP में Dependency Injection” पाठ निःशुल्क है?

हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “Koin के साथ KMP में Dependency Injection” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Koin के साथ KMP में Dependency Injection” में मैं क्या सीखूँगा?

Multiplatform setup में Koin का उपयोग करके shared modules को आपस में जोड़ें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“Koin के साथ KMP में Dependency Injection” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. KMP Project Structure: commonMain, androidMain, iosMain
  2. Platform APIs के लिए expect/actual Mechanism
  3. Repository और Use Case Layers साझा करना
  4. Koin के साथ KMP में Dependency Injection
← Kotlin Academy पर वापस जाएँ