Koin — यह क्या है, Dependency Injection के सिद्धांत और यह कैसे काम करता है

लेखक: IT Sectr प्रकाशित: 2026-05-04 पढ़ने का समय: 8 मिनट

Koin Kotlin के लिए एक DI फ्रेमवर्क है जो बिना कोड जनरेशन, रिफ्लेक्शन या एनोटेशन के काम करता है। यह लाइब्रेरी मॉड्यूल का वर्णन करने के लिए DSL का उपयोग करती है और Android, Ktor और Multiplatform के समर्थन के साथ एक हल्के कंटेनर के माध्यम से निर्भरताएं इंजेक्ट करती है। आधिकारिक Koin दस्तावेज़ीकरण के अनुसार, फ्रेमवर्क न्यूनतम boilerplate के साथ मॉड्यूल, स्कोप और Jetpack Compose के लिए अंतर्निहित समर्थन प्रदान करता है।

मुख्य बिंदु

  • Koin Kotlin के लिए एक DI फ्रेमवर्क है जो बिना रिफ्लेक्शन या कोड जनरेशन के DSL का उपयोग करता है।
  • मॉड्यूल single और factory फ़ंक्शन के माध्यम से निर्भरता रजिस्ट्रेशन का तार्किक समूहीकरण है।
  • single एक सिंगलटन रजिस्टर करता है जिसका इंस्टेंस एक बार बनाया जाता है।
  • factory प्रत्येक अनुरोध पर एक नया इंस्टेंस बनाता है।
  • Scope निर्भरता के जीवनकाल को एक घटक से बांधने की तंत्र है, जैसे Activity से।

Koin क्या है और यह कैसे अलग है

Koin Kotlin के लिए एक DI फ्रेमवर्क है जो बिना रिफ्लेक्शन, एनोटेशन या कोड जनरेशन के शुद्ध भाषा में लिखा गया है। Dagger Hilt के विपरीत, जिसे कंपाइल समय पर एनोटेशन प्रोसेसर और कोड जनरेशन की आवश्यकता होती है, Koin मॉड्यूल का वर्णन करने के लिए हल्के DSL का उपयोग करके पूरी तरह से रनटाइम पर काम करता है।

Koin का मुख्य विचार जटिल निर्भरता ग्राफ और कंपोनेंट ट्री की अवधारणाओं को सीखने की आवश्यकता के बिना निर्भरताओं को रजिस्टर और हल करने के लिए एक सरल API प्रदान करना है। डेवलपर बताता है कि कंटेनर के लिए कौन सी कक्षाएं उपलब्ध हैं, और Koin उन्हें constructor या lazy delegates by inject के माध्यम से स्वचालित रूप से इंजेक्ट करता है। फ्रेमवर्क Kotlin Multiplatform के साथ पूरी तरह से संगत है, जो Android, iOS और सर्वर-साइड पर एक एकीकृत DI दृष्टिकोण की अनुमति देता है।

Kotlin Developers Community सर्वेक्षण (2025) के अनुसार, Koin का उपयोग 31% वाणिज्यिक Android प्रोजेक्ट में किया जाता है, जो केवल Hilt (47%) के बाद दूसरे स्थान पर है। इसे चुनने का मुख्य कारण सेटअप में आसानी और कोड जनरेशन की कोई आवश्यकता नहीं है, जो प्रोजेक्ट बिल्ड को गति देता है।

मध्यम और बड़े प्रोजेक्ट के लिए Koin चुनें जहां तेज विकास शुरुआत महत्वपूर्ण है, या Kotlin Multiplatform समाधानों के लिए जहां Hilt आर्किटेक्चरल कारणों से उपलब्ध नहीं है।

Koin रिफ्लेक्शन या कोड जनरेशन का उपयोग नहीं करता है — सभी रजिस्ट्रेशन reified प्रकारों के साथ inline फ़ंक्शन पर बनाए गए हैं जो कंपाइल समय पर फ़ंक्शन बॉडी में ठोस प्रकार को प्रतिस्थापित करते हैं। यह Koin को अंतिम APK आकार के मामले में सबसे हल्के DI फ्रेमवर्क में से एक बनाता है: Koin जोड़ने से एप्लिकेशन का आकार केवल 100-150 KB बढ़ता है, जबकि Dagger Hilt जनरेटेड कोड के कारण लगभग 500 KB जोड़ता है।

Koin कंटेनर और DSL कैसे काम करते हैं

Koin कंटेनर startKoin फ़ंक्शन के माध्यम से इनिशियलाइज़ किया जाता है, जो कॉन्फ़िगरेशन के साथ एक लैम्ब्डा स्वीकार करता है। इस लैम्ब्डा के अंदर, रजिस्ट्रेशन वाले मॉड्यूल — DI लॉजिक का मुख्य बिल्डिंग ब्लॉक — वर्णित किए जाते हैं।

startKoin और मॉड्यूल

startKoin फ़ंक्शन एक वैश्विक कंटेनर बनाता है जो GlobalContext के माध्यम से एप्लिकेशन में कहीं से भी पहुंच योग्य है, हालांकि मल्टी-मॉड्यूल प्रोजेक्ट में पृथक कंटेनर बनाने के लिए KoinApplication का उपयोग करने की अनुशंसा की जाती है। Android में, इनिशियलाइज़ेशन के लिए AndroidContext का उपयोग किया जाता है, जो स्वचालित रूप से Application जीवनचक्र से बंध जाता है। मॉड्यूल modules पैरामीटर के माध्यम से पंजीकृत किए जाते हैं, जो Module इंस्टेंस की सूची स्वीकार करता है।

kotlin
val networkModule = module {
    single {
        OkHttpClient()
    }
    single {
        Retrofit.Builder()
            .baseUrl("https://api.example.com")
            .build()
    }
}

startKoin {
    modules(networkModule)
}

प्रत्येक मॉड्यूल में single (सिंगलटन) या factory (नया इंस्टेंस) के माध्यम से परिभाषाएं होती हैं। परिभाषाएं get() के माध्यम से अन्य पंजीकृत निर्भरताओं को संदर्भित कर सकती हैं, जो स्पष्ट प्रकार निर्दिष्टीकरण और boilerplate कोड के बिना एक इंजेक्शन ग्राफ बनाती हैं।

DSL और inline फ़ंक्शन

Koin संदर्भ से प्रकार अनुमान के लिए reified पैरामीटर के साथ inline फ़ंक्शन का सक्रिय रूप से उपयोग करता है। यह वर्ग को स्पष्ट रूप से निर्दिष्ट किए बिना रजिस्ट्रेशन लिखने की अनुमति देता है: single { MyService() } लैम्ब्डा के रिटर्न मान से स्वचालित रूप से प्रकार निर्धारित करता है।

Dagger के विपरीत, Koin कंपाइल समय पर निर्भरता ग्राफ की जांच नहीं करता है — सभी त्रुटियां किसी अनसुलझी निर्भरता तक पहली पहुंच पर रनटाइम पर पाई जाती हैं। यह एक समझौता है जो कोड को काफी सरल बनाता है और बिल्ड को गति देता है, लेकिन DI कॉन्फ़िगरेशन के परीक्षण कवरेज की आवश्यकता होती है। कई टीमें कंपाइल-टाइम जांच की कमी के बावजूद, विकास की गति और सरलता के लिए Koin चुनती हैं।

Koin संस्करण 3.5 में, Koin Annotations प्लगइन के माध्यम से प्रयोगात्मक कंपाइल-टाइम ग्राफ जांच दिखाई दी। डेवलपर @Module और @KoinComponent एनोटेशन जोड़ता है, और प्लगइन सत्यापन कोड उत्पन्न करता है जो बिल्ड के दौरान चलता है। हालांकि, Koin का मुख्य लाभ — कोई कोड जनरेशन नहीं — इस मोड में खो जाता है, इसलिए अधिकांश टीमें परीक्षणों के माध्यम से रनटाइम जांच के साथ क्लासिक DSL दृष्टिकोण का उपयोग जारी रखती हैं।

Koin में निर्भरता इंजेक्शन के तरीके

Koin निर्भरता इंजेक्ट करने के कई तरीके प्रदान करता है: by inject(), get() और सीधे कंस्ट्रक्टर पासिंग। विकल्प उपयोग के संदर्भ पर निर्भर करता है।

by inject() — आलसी इंजेक्शन

by inject डेलिगेट Android ViewModels और फ्रैगमेंट में सबसे आम इंजेक्शन विधि है। निर्भरता आलसी रूप से इनिशियलाइज़ होती है — केवल पहली प्रॉपर्टी एक्सेस पर। यह संसाधन-भारी सेवाओं के लिए कुशल है जिनकी तुरंत आवश्यकता नहीं हो सकती है।

kotlin
class MainViewModel : ViewModel() {
    private val repository: UserRepository by inject()

    fun loadUsers() {
        repository.fetchAll()
    }
}

get() — स्पष्ट प्राप्ति

get फ़ंक्शन तुरंत एक निर्भरता इंस्टेंस लौटाता है। इसका उपयोग रजिस्ट्रेशन के दौरान फैक्ट्री लैम्ब्डा के अंदर या जब निर्भरता आलसी इनिशियलाइज़ेशन के बिना सिंक्रोनस संदर्भ में आवश्यक हो, किया जाता है। by inject() के विपरीत, get() आलसी लोडिंग का समर्थन नहीं करता है और कॉल के समय कंटेनर के पहले से इनिशियलाइज़ होने की आवश्यकता होती है।

Koin में मॉड्यूल और स्कोप

Koin में स्कोप निर्भरता जीवनकाल को एक विशिष्ट घटक, जैसे Activity, Fragment या कस्टम सत्र से बांधने की एक तंत्र है। यह Android एप्लिकेशन में मेमोरी प्रबंधन के लिए मुख्य कार्यक्षमता है।

scope — एक घटक से बंधन

मॉड्यूल के अंदर scope फ़ंक्शन एक स्कोप बनाता है जो तब तक जीवित रहता है जब तक बंधा हुआ घटक जीवित रहता है। स्कोप में पंजीकृत सभी निर्भरताएं बंद होने पर नष्ट हो जाती हैं, जो मेमोरी लीक को रोकता है।

kotlin
val userScope = module {
    scope<UserSession> {
        scoped {
            UserRepository(get())
        }
        scoped {
            SessionManager(get())
        }
    }
}

scoped फ़ंक्शन एक निर्भरता पंजीकृत करता है जो केवल स्कोप के अंदर मौजूद रहेगी। जब स्कोप बंद होता है, सभी scoped ऑब्जेक्ट कचरा संग्रह के लिए उपलब्ध हो जाते हैं।

single बनाम factory

single आलसी इनिशियलाइज़ेशन के साथ पूरे एप्लिकेशन के लिए एक एकल इंस्टेंस पंजीकृत करता है। स्टेटलेस सेवाओं के लिए उपयोग किया जाता है: नेटवर्क क्लाइंट, कैश, लॉगर।

factory प्रत्येक get() कॉल पर एक नया इंस्टेंस बनाता है। इसका उपयोग ViewModel, रिपॉजिटरी और स्टेटफुल ऑब्जेक्ट के लिए किया जाता है जहां प्रत्येक एक्सेस पर एक ताजा इंस्टेंस महत्वपूर्ण होता है।

Android प्रोजेक्ट में Koin

Koin को Android प्रोजेक्ट में एकीकृत करना न्यूनतम है: बस build.gradle में एक डिपेंडेंसी जोड़ें और Application.onCreate में startKoin कॉल करें। Koin Jetpack Compose, Navigation और WorkManager के साथ एकीकरण के लिए मॉड्यूल प्रदान करता है, जो इसे Hilt का पूर्ण विकल्प बनाता है।

विशेष koin-android-compose लाइब्रेरी koinViewModel() और koinInject() के माध्यम से सीधे Composable फ़ंक्शन में निर्भरता इंजेक्ट करने की अनुमति देती है। यह प्रत्येक स्क्रीन के पैरामीटर के माध्यम से कंटेनर पास करने की आवश्यकता को समाप्त करता है और स्वचालित जीवनचक्र बंधन के माध्यम से ViewModel कोड को साफ बनाता है।

Google I/O 2024 के अनुसार, Jetpack Compose नए Android प्रोजेक्ट के लिए प्राथमिक फ्रेमवर्क बन गया। Koin बिना अतिरिक्त कॉन्फ़िगरेशन के Compose के लिए मूल समर्थन प्रदान करता है, coroutine संदर्भ को ध्यान में रखते हुए koinViewModel() के माध्यम से स्वचालित रूप से स्कोप को ViewModel जीवनचक्र से बांधता है।

परीक्षण के लिए, Koin koinTest और koinTestRule फ़ंक्शन प्रदान करता है, जो परीक्षण मॉड्यूल के साथ एक पृथक परीक्षण कंटेनर बनाते हैं और परीक्षण पूरा होने के बाद इसे स्वचालित रूप से बंद कर देते हैं। यह परीक्षण अलगाव सुनिश्चित करता है और परीक्षण मामलों के बीच स्थिति लीक को रोकता है।

Jetpack Navigation के साथ Koin एकीकरण koin-androidx-navigation मॉड्यूल के माध्यम से कार्यान्वित किया जाता है। प्रत्येक स्क्रीन का ViewModel स्क्रीन रोटेशन पर स्थिति संरक्षण और एप्लिकेशन निलंबन के बाद पुनर्प्राप्ति के लिए SavedStateHandle पास करने के साथ by viewModel() के माध्यम से स्वचालित रूप से निर्भरताएं प्राप्त करता है।

Koin के साथ ViewModel के यूनिट परीक्षण के लिए, koin-test-junit5 या koin-test-junit4 लाइब्रेरी से koinTestRule का उपयोग किया जाता है। नियम प्रत्येक परीक्षण से पहले परीक्षण मॉड्यूल के साथ एक पृथक कंटेनर बनाता है और पूरा होने के बाद स्वचालित रूप से बंद कर देता है, परीक्षण मामलों के बीच स्थिति लीक को रोकता है। वास्तविक निर्भरताएं MockK के माध्यम से मॉक से बदल दी जाती हैं: single { mockk() } रजिस्ट्रेशन वाला मॉड्यूल मुख्य मॉड्यूल को ओवरराइड करता है, और परीक्षण में ViewModel को पूर्वानुमानित निर्भरता व्यवहार मिलता है।

Koin 3.x की प्रमुख विशेषताओं में से एक Kotlin पर सर्वर एप्लिकेशन बनाने के लिए Ktor और डेस्कटॉप एप्लिकेशन के लिए Compose Multiplatform का समर्थन है। यह Koin को इंजेक्शन प्रतिमान को बदले बिना सभी तीन Kotlin प्लेटफॉर्म को कवर करने वाला एकमात्र DI फ्रेमवर्क बनाता है। koin-ktor मॉड्यूल Application ब्लॉक में install(Koin) के माध्यम से निर्भरता पंजीकृत करने और Android की तरह by inject() के माध्यम से रूट में सेवाएं इंजेक्ट करने की अनुमति देता है। यह Koin को मोबाइल क्लाइंट से सर्वर बैकएंड तक किसी भी आर्किटेक्चर के Kotlin प्रोजेक्ट के लिए एक सार्वभौमिक DI समाधान बनाता है।

koin-androidx-navigation मॉड्यूल के माध्यम से Jetpack Navigation के साथ Koin एकीकरण प्रत्येक स्क्रीन के लिए मैन्युअल रूप से ViewModelProvider.Factory बनाने की आवश्यकता को समाप्त करता है। मल्टी-मॉड्यूल प्रोजेक्ट के लिए, Koin loadKoinModules के माध्यम से आलसी मॉड्यूल लोडिंग का समर्थन करता है, जो प्रत्येक फीचर मॉड्यूल को स्वतंत्र रूप से अपना DI कॉन्फ़िगरेशन कनेक्ट करने की अनुमति देता है।

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

Koin Dagger Hilt से कैसे अलग है?

Koin बिना कोड जनरेशन या एनोटेशन के रनटाइम पर काम करता है, जो बिल्ड को गति देता है लेकिन कंपाइल समय पर निर्भरता ग्राफ की जांच नहीं करता है। Hilt कंपाइल समय पर कोड उत्पन्न करता है और DI त्रुटियों को पहले पकड़ता है, लेकिन जटिल सेटअप की आवश्यकता होती है और बिल्ड को धीमा करता है।

क्या Koin Kotlin Multiplatform का समर्थन करता है?

हां, Koin पूरी तरह से Kotlin Multiplatform का समर्थन करता है। koin-core लाइब्रेरी सभी Kotlin प्लेटफॉर्म पर काम करती है, जबकि koin-android और koin-compose क्रमशः Android और iOS के लिए प्लेटफॉर्म-विशिष्ट क्षमताएं जोड़ते हैं।

Koin में चक्रीय निर्भरताओं को कैसे संभालें?

चक्रीय निर्भरताएं रनटाइम पर StackOverflowError का कारण बनती हैं। Koin उन्हें स्वचालित रूप से नहीं पहचानता है। समाधान आर्किटेक्चर रिफैक्टरिंग है: एक सामान्य इंटरफ़ेस निकालना, Listener/Observer पैटर्न का उपयोग करना, या विलंबित इनिशियलाइज़ेशन के साथ फैक्ट्री के माध्यम से चक्र को तोड़ना।

क्या मुझे स्कोप को मैन्युअल रूप से बंद करने की आवश्यकता है?

Android में, स्कोप को AndroidScope के माध्यम से Activity या Fragment जीवनचक्र से बांधा जा सकता है। जब घटक नष्ट हो जाता है, Koin स्वचालित रूप से संबंधित स्कोप को बंद कर देता है। कस्टम स्कोप (उपयोगकर्ता सत्र) में, scope.close कॉल करके मैन्युअल रूप से बंद किया जाता है।

Koin के साथ कोड का परीक्षण कैसे करें?

koin-test मॉड्यूल से koinTest फ़ंक्शन का उपयोग करें। यह परीक्षण मॉड्यूल के साथ एक पृथक कंटेनर बनाता है जो परीक्षण के बाद स्वचालित रूप से बंद हो जाता है। वास्तविक निर्भरताएं Mockito या MockK के साथ मॉड्यूल के माध्यम से मॉक से बदल दी जाती हैं।

सारांश

  • Koin बिना रिफ्लेक्शन, एनोटेशन या कोड जनरेशन के DSL के साथ Kotlin के लिए एक DI फ्रेमवर्क है।
  • मॉड्यूल single (सिंगलटन) और factory (नया इंस्टेंस) के माध्यम से रजिस्ट्रेशन समूहित करते हैं।
  • startKoin by inject() और get() के माध्यम से सुलभ एक वैश्विक कंटेनर इनिशियलाइज़ करता है।
  • स्कोप निर्भरता जीवनकाल को Android घटक जीवनचक्र से बांधता है।
  • Compose में इंजेक्शन koinViewModel() और koinInject() के माध्यम से किया जाता है।
  • Koin Kotlin Multiplatform का समर्थन करता है, जो सभी प्लेटफॉर्म पर एक एकीकृत DI दृष्टिकोण की अनुमति देता है।
  • DI त्रुटियां रनटाइम पर पाई जाती हैं, इसलिए कॉन्फ़िगरेशन का परीक्षण कवरेज अनिवार्य है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें