Kotlin के लिए Dependency Injection कंटेनर: पूरी जानकारी और तुलना
Dependency Injection (DI) आधुनिक डेवलपमेंट का एक महत्वपूर्ण पैटर्न है, जो कम जुड़े हुए, टेस्ट करने योग्य और स्केलेबल एप्लिकेशन बनाने में मदद करता है। Kotlin इकोसिस्टम में कई शक्तिशाली DI-कंटेनर हैं, जिनमें से प्रत्येक की अपनी विशेषताएं हैं। इस लेख में हम तीन सबसे लोकप्रिय समाधानों: Koin, Kodein-DI और Dagger/Hilt के बारे में विस्तार से जानेंगे। आप जानेंगे कि ये कैसे काम करते हैं, इनके फायदे और नुकसान क्या हैं, और आपके प्रोजेक्ट के लिए कौन सा टूल सबसे अच्छा है।
Dependency Injection कंटेनर क्या है?
DI-कंटेनर एक फ्रेमवर्क है जो ऑब्जेक्ट्स (डिपेंडेंसी) के निर्माण और जीवनचक्र को प्रबंधित करता है और स्वचालित रूप से उन्हें क्लासेस में इंजेक्ट करता है। कंस्ट्रक्टर या फैक्ट्री के माध्यम से मैन्युअल रूप से डिपेंडेंसी बनाने के बजाय, आप मॉड्यूल में बिल्डिंग नियमों का वर्णन करते हैं, और कंटेनर सारी रूटीन संभाल लेता है। यह सैकड़ों क्लासेस वाले बड़े प्रोजेक्ट्स में विशेष रूप से उपयोगी है।
1. Koin — Kotlin के लिए हल्का और सरल DI
Koin एक DSL-ओरिएंटेड DI-कंटेनर है, जो शुद्ध Kotlin में लिखा गया है। इसे कोड जनरेशन, रिफ्लेक्शन या एनोटेशन की आवश्यकता नहीं है। सभी सेटिंग्स सुविधाजनक DSL (Domain Specific Language) के माध्यम से की जाती हैं।
इंस्टॉलेशन
// build.gradle.kts
implementation("io.insert-koin:koin-core:3.5.3")
उपयोग का उदाहरण
// डिपेंडेंसी परिभाषित करें
val appModule = module {
single { HttpClient() }
factory { UserRepository(get()) }
}
// Koin शुरू करें
fun main() {
startKoin {
modules(appModule)
}
// डिपेंडेंसी प्राप्त करें
val repo: UserRepository by inject()
}
class UserRepository(private val client: HttpClient)
फायदे:
- सीखना बहुत आसान — कोई एनोटेशन या कोड जनरेशन नहीं
- Android के साथ आसानी से इंटीग्रेट होता है (Koin Android)
- स्कोप API का समर्थन
- तेज़ कंपाइलेशन
नुकसान:
- गलतियाँ केवल runtime में पकड़ में आती हैं
- कंपाइल टाइम पर डिपेंडेंसी ग्राफ की जाँच नहीं होती
- रिफ्लेक्शन के कारण Dagger से थोड़ा धीमा
2. Kodein-DI — लचीला और मल्टी-प्लेटफॉर्म
Kodein-DI शुद्ध Kotlin पर एक और DI-फ्रेमवर्क है। यह उन्नत सुविधाएँ प्रदान करता है: मल्टी-प्लेटफॉर्म प्रोजेक्ट्स (KMP) का समर्थन, लेज़ी इनिशियलाइज़ेशन, डिपेंडेंसी टैगिंग और बिल्ट-इन फैक्ट्रीज़।
कॉन्फ़िगरेशन का उदाहरण
val di = DI {
bind<ApiService>() with singleton { RetrofitApiService() }
bind<Logger>() with provider { ConsoleLogger() }
bind<UserRepository>() with factory { UserRepositoryImpl(instance()) }
}
// उपयोग
class MainActivity {
private val repo: UserRepository by di.instance()
}
फायदे:
- Kotlin Multiplatform (iOS, JS, JVM) का पूर्ण समर्थन
- शक्तिशाली टैग और मॉडिफायर सिस्टम
- नेस्टेड कंटेनर बनाने की क्षमता
- स्कोप और थ्रेड-सेफ्टी का समर्थन
नुकसान:
- Koin की तुलना में कम लोकप्रिय (कम समुदाय और ट्यूटोरियल)
- सरल प्रोजेक्ट्स के लिए DSL भारी लग सकता है
- डिपेंडेंसी की जाँच runtime पर ही होती है
3. Dagger / Hilt — Google का परफॉरमेंस-ड्रिवन DI
Dagger और इसका Android रैपर Hilt DI-फ्रेमवर्क हैं जो कंपाइल टाइम पर कोड जनरेशन पर आधारित हैं। ये एनोटेशन (@Inject, @Module, @Component) का उपयोग करते हैं और सभी बाइंडिंग कोड पहले से तैयार करते हैं। इससे runtime में अधिकतम परफॉरमेंस मिलती है।
Hilt के साथ उदाहरण
@HiltAndroidApp
class MyApplication : Application()
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var repository: UserRepository
}
@Module
@InstallIn(SingletonComponent::class)
obj