JavaScript में Dependency Injection: शुरुआती गाइड

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

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

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

परिचय: Dependency Injection क्या है और इसकी आवश्यकता क्यों है?

\n\n

कल्पना कीजिए कि आप एक कंप्यूटर असेंबल कर रहे हैं। एक तैयार मोनोब्लॉक खरीदने के बजाय, आप अलग-अलग प्रोसेसर, ग्राफिक्स कार्ड और RAM चुनते हैं और उन्हें मदरबोर्ड से जोड़ते हैं। अगर आप ग्राफिक्स कार्ड अपग्रेड करना चाहते हैं, तो आपको पूरा कंप्यूटर बदलने की ज़रूरत नहीं है — बस एक कंपोनेंट बदल दें। Dependency Injection (DI) प्रोग्रामिंग में बिल्कुल इसी सिद्धांत पर काम करता है।

\n\n

Dependency Injection (डिपेंडेंसी इंजेक्शन) एक डिज़ाइन पैटर्न है जिसमें कोई ऑब्जेक्ट अपनी डिपेंडेंसी खुद नहीं बनाता, बल्कि उन्हें बाहर से प्राप्त करता है। JavaScript और Node.js के संदर्भ में, इसका मतलब है कि कोई क्लास या फ़ंक्शन दूसरे क्लास के इंस्टेंस खुद नहीं बनाता, बल्कि उन्हें कंस्ट्रक्टर या पैरामीटर के ज़रिए स्वीकार करता है।

\n\n

यह दृष्टिकोण SOLID के Dependency Inversion Principle का हिस्सा है और कोड को अधिक लचीला, परीक्षण योग्य और रखरखाव में आसान बनाता है। इस लेख में हम शुरुआती डेवलपर्स के लिए व्यावहारिक उदाहरणों के साथ DI को समझेंगे।

\n\n

समस्या: कोड में कठोर जुड़ाव (Tight Coupling)

\n\n

एक सामान्य Node.js एप्लिकेशन पर विचार करें। मान लीजिए हमारे पास ईमेल नोटिफिकेशन भेजने के लिए एक सर्विस है:

\n\n
// Dependency Injection के बिना\nclass EmailService {\n  sendEmail(to, subject, body) {\n    console.log(`ईमेल भेजा जा रहा है ${to} पर: ${subject}`);\n    // वास्तविक भेजने की लॉजिक\n  }\n}\n\nclass UserService {\n  constructor() {\n    this.emailService = new EmailService(); // ❌ कठोर जुड़ाव\n  }\n\n  registerUser(email) {\n    // यूज़र रजिस्ट्रेशन की लॉजिक\n    this.emailService.sendEmail(email, 'स्वागत है!', '...');\n  }\n}\n\nconst userService = new UserService();\nuserService.registerUser('user@example.com');\n
\n\n

समस्या क्या है? UserService क्लास EmailService की एक विशेष इम्प्लीमेंटेशन से कसकर जुड़ा हुआ है। अगर आप:

\n
    \n
  • ईमेल की जगह SMS भेजना चाहते हैं
  • \n
  • सभी संदेशों की लॉगिंग जोड़ना चाहते हैं
  • \n
  • बिना वास्तविक ईमेल भेजे UserService का परीक्षण करना चाहते हैं
  • \n
\n\n

तो आपको UserService का कोड फिर से लिखना होगा। यह Open/Closed Principle का उल्लंघन है।

\n\n

समाधान: कंस्ट्रक्टर के माध्यम से डिपेंडेंसी इंजेक्शन

\n\n

डिपेंडेंसी इंजेक्ट करने का सबसे सरल तरीका है उन्हें कंस्ट्रक्टर के ज़रिए पास करना। आइए अपने उदाहरण को फिर से लिखें:

\n\n
// Dependency Injection के साथ\nclass EmailService {\n  sendEmail(to, subject, body) {\n    console.log(`ईमेल भेजा जा रहा है ${to} पर: ${subject}`);\n  }\n}\n\nclass SmsService {\n  sendSms(phone, message) {\n    console.log(`SMS भेजा जा रहा है ${phone} पर: ${message}`);\n  }\n}\n\nclass UserService {\n  constructor(notificationService) {\n    this.notificationService = notificationService; // ✅ डिपेंडेंसी इंजेक्शन\n  }\n\n  registerUser(contact, isPhone = false) {\n    // रजिस्ट्रेशन लॉजिक\n    if (isPhone) {\n      this.notificationService.sendSms(contact, 'स्वागत है!');\n    } else {\n      this.notificationService.sendEmail(contact, 'स्वागत है!', '...');\n    }\n  }\n}\n\n// उपयोग\nconst emailService = new EmailService();\nconst userServiceWithEmail = new UserService(emailService);\nuserServiceWithEmail.registerUser('user@example.com');\n\nconst smsService = new SmsService();\nconst userServiceWithSms = new UserService(smsService);\nuserServiceWithSms.registerUser('+1234567890', true);\n
\n\n

अब UserService को यह नहीं पता कि कौन सी सर्विस इस्तेमाल हो रही है — ईमेल या SMS। वह बस पास किए गए ऑब्जेक्ट के sendEmail या sendSms मेथड को कॉल करता है। इसे डिपेंडेंसी इनवर्ज़न कहते हैं: उच्च-स्तरीय मॉड्यूल निम्न-स्तरीय मॉड्यूल पर निर्भर नहीं होता, दोनों एब्स्ट्रैक्शन पर निर्भर होते हैं।

\n\n

इस दृष्टिकोण के लाभ:

\n
    \n
  • लचीलापन: आसानी से बदला जा सकता है

ब्लॉग

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