कोटलिन में डिपेंडेंसी इंजेक्शन व्यवहार में: एक संपूर्ण मार्गदर्शिका

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: डिपेंडेंसी इंजेक्शन क्या है और कोटलिन में इसकी आवश्यकता क्यों है?

\n

Dependency Injection (DI) एक डिज़ाइन पैटर्न है जो कोड को अधिक लचीला, परीक्षण योग्य और रखरखाव योग्य बनाता है। वस्तु के स्वयं अपनी डिपेंडेंसी बनाने के बजाय, DI उन्हें बाहर से स्थानांतरित (इंजेक्ट) करता है। कोटलिन में, इसके संक्षिप्त सिंटैक्स और शक्तिशाली क्षमताओं के साथ, DI विशेष रूप से एक सुरुचिपूर्ण उपकरण बन जाता है।

\n

कल्पना करें कि आप पिज्जा ऑर्डर करने के लिए एक एप्लिकेशन लिख रहे हैं। आपके पास एक OrderService क्लास है, जिसे नोटिफिकेशन भेजना होता है। DI के बिना यह इस तरह दिखेगा:

\n
class OrderService {\n    private val notifier = EmailNotifier() // कठोर संबंध\n\n    fun placeOrder(order: Order) {\n        // ऑर्डर का तर्क\n        notifier.send("आपका ऑर्डर स्वीकार कर लिया गया!")\n    }\n}
\n

समस्या: आप आसानी से EmailNotifier को SmsNotifier से बदल नहीं पाएंगे या वास्तविक ईमेल भेजे बिना OrderService का परीक्षण नहीं कर पाएंगे। DI कंस्ट्रक्टर के माध्यम से डिपेंडेंसी इंजेक्ट करके इस समस्या का समाधान करता है:

\n
class OrderService(private val notifier: Notifier) {\n    fun placeOrder(order: Order) {\n        notifier.send("आपका ऑर्डर स्वीकार कर लिया गया!")\n    }\n}
\n

अब OrderService को यह नहीं पता कि नोटिफिकेशन कैसे भेजा जाता है। यही DI का सार है: कमजोर युग्मन और उच्च पुन: प्रयोज्यता।

\n\n

कोटलिन में DI लागू करने के मुख्य तरीके

\n

कोटलिन में डिपेंडेंसी इंजेक्शन के तीन मुख्य दृष्टिकोण हैं: मैन्युअल DI, लाइब्रेरीज़ (Koin, Dagger 2) का उपयोग, और फ्रेमवर्क (जैसे, Spring) के माध्यम से इंजेक्शन। आइए प्रत्येक को व्यवहार में देखें।

\n\n

1. मैन्युअल डिपेंडेंसी इंजेक्शन (Manual DI)

\n

सबसे सरल तरीका कंस्ट्रक्टर या सेटर्स के माध्यम से डिपेंडेंसी पास करना है। इसके लिए किसी अतिरिक्त लाइब्रेरी की आवश्यकता नहीं है और यह छोटे प्रोजेक्ट्स के लिए आदर्श है।

\n

उदाहरण: भुगतान प्रसंस्करण के लिए एक सरल सेवा बनाएं।

\n
// भुगतान गेटवे का इंटरफ़ेस\ninterface PaymentGateway {\n    fun process(amount: Double): Boolean\n}\n\n// PayPal के माध्यम से कार्यान्वयन\nclass PayPalGateway : PaymentGateway {\n    override fun process(amount: Double): Boolean {\n        println("PayPal के माध्यम से $amount भुगतान प्रसंस्करण")\n        return true\n    }\n}\n\n// डिपेंडेंसी इंजेक्शन के साथ ऑर्डर सेवा\nclass OrderService(private val paymentGateway: PaymentGateway) {\n    fun checkout(total: Double) {\n        if (paymentGateway.process(total)) {\n            println("ऑर्डर पूरा हो गया!")\n        }\n    }\n}\n\n// प्रवेश बिंदु — "फ़ैक्टरी" या "कंटेनर"\nfun main() {\n    val gateway = PayPalGateway()\n    val service = OrderService(gateway)\n    service.checkout(100.0)\n}
\n

लाभ: सरलता, पूर्ण नियंत्रण, लाइब्रेरीज़ पर कोई निर्भरता नहीं।
\nनुकसान: प्रोजेक्ट बढ़ने पर सभी डिपेंडेंसी का मैन्युअल प्रबंधन जटिल हो जाता है (मैन्युअल रूप से "कंटेनर" या "फ़ैक्टरी" बनाने की आवश्यकता होती है)।

\n\n

2. Koin के साथ डिपेंडेंसी इंजेक्शन

\n

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

\n

स्थापना: build.gradle.kts में जोड़ें:

\n
implementation("io.insert-koin:koin-core:3.5.6")
\n

उपयोग का उदाहरण:

\n
import org.koin.core.context.startKoin\nimport org.koin.dsl.module\n\n// डिपेंडेंसी मॉड्यूल\nval appModule = module {\n    single<PaymentGateway> { PayPalGateway() }\n    factory { OrderService(get()) } // get() स्वचालित रूप से PaymentGateway प्राप्त करता है\n}\n\nfun main() {\n    startKoin {\n        modules(appModule)\n    }\n\n    // कंटेनर से सेवा प्राप्त करें\n    val service: OrderService = org.koin.core.component.get()\n    service.checkout(200.0)\n}
\n

Koin की मुख्य अवधारणाएँ:

\n
    \n
  • single — एक उदाहरण (सिंगलटन) बनाता है

ब्लॉग

पुस्तक अनुशंसाएँ