जावास्क्रिप्ट में डिपेंडेंसी इंजेक्शन: पूर्ण गाइड
डिपेंडेंसी इंजेक्शन (DI) एक शक्तिशाली डिज़ाइन पैटर्न है जो इनवर्जन ऑफ कंट्रोल (IoC) के सिद्धांत का आधार है। किसी ऑब्जेक्ट द्वारा स्वयं अपनी डिपेंडेंसी बनाने के बजाय, DI उन्हें बाहर से "इंजेक्ट" करता है। यह कोड को अधिक लचीला, परीक्षण योग्य और रखरखाव योग्य बनाता है। इस लेख में, हम सरल और स्पष्ट उदाहरणों का उपयोग करके जावास्क्रिप्ट और Node.js में डिपेंडेंसी इंजेक्शन को लागू करने का तरीका समझेंगे।
डिपेंडेंसी इंजेक्शन क्या है और इसकी आवश्यकता क्यों है?
कल्पना करें कि आपके पास एक UserService क्लास है जो डेटाबेस के साथ काम करता है। DI के बिना, आप संभवतः सेवा के अंदर ही डेटाबेस का एक इंस्टेंस बनाएंगे:
class UserService { constructor() { this.db = new Database(); // कठोर संबंध }
getUser(id) { return this.db.findUser(id); }}यह कोड डिपेंडेंसी इनवर्जन प्रिंसिपल (Dependency Inversion Principle) का उल्लंघन करता है। UserService का परीक्षण करते समय, आप क्लास के कोड को बदले बिना वास्तविक डेटाबेस को मॉक-ऑब्जेक्ट से प्रतिस्थापित नहीं कर पाएंगे। DI इस समस्या का समाधान करता है:
class UserService { constructor(database) { this.db = database; // डिपेंडेंसी बाहर से पास की गई }
getUser(id) { return this.db.findUser(id); }}
// उपयोगconst db = new Database();const userService = new UserService(db);DI के मुख्य लाभ:
- परीक्षण योग्यता: डिपेंडेंसी को मॉक या स्टब से आसानी से बदला जा सकता है।
- कमजोर युग्मन: क्लासेस एब्स्ट्रैक्शन (इंटरफेस) पर निर्भर करती हैं, न कि विशिष्ट कार्यान्वयन पर।
- लचीलापन: कार्यान्वयन को बदलकर सिस्टम के व्यवहार को आसानी से बदला जा सकता है।
- कोड का पुन: उपयोग: घटक स्वतंत्र हो जाते हैं और विभिन्न संदर्भों में उपयोग किए जा सकते हैं।
जावास्क्रिप्ट में डिपेंडेंसी इंजेक्ट करने के तरीके
जावास्क्रिप्ट में डिपेंडेंसी इंजेक्ट करने के तीन मुख्य तरीके हैं:
1. कंस्ट्रक्टर के माध्यम से इंजेक्शन (Constructor Injection)
सबसे सामान्य और अनुशंसित तरीका। ऑब्जेक्ट बनाते समय डिपेंडेंसी पास की जाती हैं।
class Logger { log(message) { console.log(`[LOG]: ${message}`); }}
class OrderService { constructor(logger) { this.logger = logger; }
createOrder(data) { this.logger.log('नया ऑर्डर बनाया गया'); // ऑर्डर बनाने का तर्क }}
const logger = new Logger();const orderService = new OrderService(logger);orderService.createOrder({ product: 'Laptop', price: 1500 });2. सेटर के माध्यम से इंजेक्शन (Setter Injection)
ऑब्जेक्ट बनाने के बाद सेटर मेथड के माध्यम से डिपेंडेंसी सेट की जाती हैं। वैकल्पिक डिपेंडेंसी के लिए उपयुक्त।
class EmailService { constructor() { this.transporter = null; }
setTransporter(transporter) { this.transporter = transporter; }
send(email) { if (!this.transporter) { throw new Error('Transporter सेट नहीं है'); } this.transporter.sendMail(email); }}
const emailService = new EmailService();emailService.setTransporter(someMailTransporter);3. इंटरफेस के माध्यम से इंजेक्शन (Interface Injection — सशर्त)
जावास्क्रिप्ट में मूल इंटरफेस नहीं हैं, लेकिन अनुबंधों का वर्णन करने के लिए TypeScript या दस्तावेज़ीकरण का उपयोग किया जा सकता है। व्यवहार में, यह विधियों की उपस्थिति की जाँच करने तक सीमित है।
Node.js में एक सरल DI-कंटेनर बनाना
बड़े एप्लिकेशन में डिपेंडेंसी प्रबंधित करने के लिए DI-कंटेनर का उपयोग करना सुविधाजनक होता है। यह सभी डिपेंडेंसी को संग्रहीत करता है और स्वचालित रूप से उन्हें हल करता है। यहाँ एक न्यूनतम कार्यान्वयन है:
class Container { constructor() { this.services = new Map(); this.singletons = new Map(); }
// सेवा के लिए फैक्ट्री पंजीकृत करना register(name,