Koin — Kotlin के लिए Dependency Injection कंटेनर
आधुनिक Kotlin-डेवलपमेंट में डिपेंडेंसी प्रबंधन एक महत्वपूर्ण कार्य है। Koin एक हल्का Dependency Injection (DI) कंटेनर है, जो Kotlin में लिखा गया है, और इसे कोड जनरेशन, रिफ्लेक्शन या जटिल कॉन्फ़िगरेशन की आवश्यकता नहीं होती है। Dagger या Spring के विपरीत, Koin एक सरल DSL का उपयोग करता है और कोरूटीन और Flow के साथ पूरी तरह से एकीकृत होता है। इस पृष्ठ पर हम समझेंगे कि Koin कैसे स्थापित करें, मॉड्यूल घोषित करें, डिपेंडेंसी इंजेक्ट करें और इसे शैक्षिक परियोजनाओं में उपयोग करें।
Dependency Injection क्या है?
Dependency Injection (DI) एक पैटर्न है जिसमें कोई ऑब्जेक्ट अपनी डिपेंडेंसी बाहर से प्राप्त करता है, न कि स्वयं बनाता है। यह परीक्षण को सरल बनाता है, कोड को अधिक लचीला बनाता है और युग्मन को कम करता है। Koin एक कंटेनर के माध्यम से DI को लागू करता है जो ऑब्जेक्ट के निर्माण और जीवनचक्र का प्रबंधन करता है।
Koin की स्थापना
फ़ाइल build.gradle.kts में निम्नलिखित डिपेंडेंसी जोड़ें:
// build.gradle.ktsdependencies { implementation("io.insert-koin:koin-core:3.5.3") // Android के लिए implementation("io.insert-koin:koin-android:3.5.3")}Koin की मुख्य अवधारणाएँ
- मॉड्यूल (module) — एक ब्लॉक जिसमें डिपेंडेंसी घोषित की जाती हैं।
- परिभाषा (definition) — ऑब्जेक्ट बनाने का तरीका (single, factory, scoped)।
- कंटेनर (KoinApplication) — मॉड्यूल को चलाता और प्रबंधित करता है।
- इंजेक्शन (inject) — डेलिगेट या फ़ंक्शन के माध्यम से डिपेंडेंसी प्राप्त करना।
मॉड्यूल बनाना और डिपेंडेंसी घोषित करना
Koin मॉड्यूल का वर्णन करने के लिए DSL का उपयोग करता है। एक रिपॉजिटरी और सर्विस के साथ उदाहरण देखें:
// इंटरफ़ेस और कार्यान्वयन परिभाषित करेंinterface UserRepository { fun getUser(id: Int): String}
class UserRepositoryImpl : UserRepository { override fun getUser(id: Int) = "User #$id"}
class UserService(private val repository: UserRepository) { fun printUser(id: Int) { println(repository.getUser(id)) }}
// Koin मॉड्यूलval appModule = module { // single — एक उदाहरण बनाता है (सिंगलटन) single<UserRepository> { UserRepositoryImpl() } // factory — प्रत्येक अनुरोध पर एक नया उदाहरण बनाता है factory { UserService(get()) }}कंटेनर चलाना
डिपेंडेंसी का उपयोग करने से पहले Koin को चलाना आवश्यक है:
import org.koin.core.context.startKoin
fun main() { startKoin { modules(appModule) } // अब डिपेंडेंसी प्राप्त की जा सकती हैं val service: UserService by inject() service.printUser(42)}डिपेंडेंसी इंजेक्शन के तरीके
- by inject() — आलसी प्राप्ति (अनुशंसित)।
- get() — तत्काल प्राप्ति।
- कंस्ट्रक्टर — Koin स्वचालित रूप से कंस्ट्रक्टर में डिपेंडेंसी पास करता है।
by inject() का उपयोग करने का उदाहरण:
class MyActivity : AppCompatActivity() { // आलसी इंजेक्शन private val repository: UserRepository by inject() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // repository का उपयोग करें }}Scoped डिपेंडेंसी
कभी-कभी ऐसी डिपेंडेंसी बनाने की आवश्यकता होती है जो एक विशिष्ट संदर्भ (जैसे उपयोगकर्ता सत्र) के भीतर रहती है। इसके लिए scope का उपयोग किया जाता है:
val sessionModule = module { scope<UserSession> { scoped { UserSessionManager(get()) } }}कोरूटीन के साथ काम करना
Koin koin-core-coroutines मॉड्यूल के माध्यम से कोरूटीन का समर्थन करता है। एसिंक्रोनस प्राप्ति का उदाहरण:
import org.koin.core.component.KoinComponentimport org.koin.core.component.inject