Awilix: JavaScript (Node.js) के लिए Dependency Injection कंटेनर

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

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

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

JavaScript (Node.js) के लिए Dependency Injection कंटेनर: Awilix

आधुनिक Node.js डेवलपमेंट में कोड आर्किटेक्चर को साफ और टेस्ट करने योग्य बनाए रखना बेहद जरूरी है। इसमें मदद करने वाला एक प्रमुख पैटर्न है Dependency Injection (DI) यानी डिपेंडेंसी इंजेक्शन। JavaScript में इस पैटर्न को प्रभावी ढंग से लागू करने के लिए विशेष लाइब्रेरी बनाई गई हैं, जिन्हें Dependency Injection कंटेनर कहा जाता है। इस लेख में हम सबसे लोकप्रिय और हल्की लाइब्रेरी Awilix के बारे में विस्तार से जानेंगे।

Dependency Injection क्या है और कंटेनर की आवश्यकता क्यों है?

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

Awilix: हल्का और शक्तिशाली DI-कंटेनर

Awilix JavaScript (Node.js) के लिए एक लाइब्रेरी है जो कंटेनर का उपयोग करके Inversion of Control (IoC) पैटर्न को लागू करती है। इसे Node.js के लिए स्क्रैच से लिखा गया है, जो एसिंक्रोनस डिपेंडेंसी रिजॉल्यूशन, विभिन्न रजिस्ट्रेशन स्टाइल (क्लास, फैक्ट्री, वैल्यू) और कंस्ट्रक्टर के माध्यम से ऑटोमैटिक डिपेंडेंसी डिटेक्शन को सपोर्ट करता है।

मुख्य विशेषताएं:

  • ऑटोमैटिक इंजेक्शन: कंटेनर कंस्ट्रक्टर या फंक्शन के पैरामीटर्स को पार्स करके ऑटोमैटिक रूप से जरूरी डिपेंडेंसी इंजेक्ट करता है।
  • एसिंक्रोनस सपोर्ट: डिपेंडेंसी एसिंक्रोनस हो सकती हैं (जैसे डेटाबेस कनेक्शन), और कंटेनर उनके रिजॉल्यूशन का सही तरीके से इंतजार करता है।
  • विभिन्न रजिस्ट्रेशन मोड: आप क्लास (asClass), फैक्ट्री फंक्शन (asFunction) या तैयार वैल्यू (asValue) रजिस्टर कर सकते हैं।
  • स्कोप (Scopes): ऑब्जेक्ट के विभिन्न लाइफसाइकल (singleton, transient, scoped) को सपोर्ट करता है।
  • मॉड्यूलरिटी: कंटेनर को आसानी से मॉड्यूल में विभाजित किया जा सकता है और एप्लिकेशन के विभिन्न हिस्सों में डिपेंडेंसी रजिस्टर की जा सकती है।

इंस्टॉलेशन और बेसिक उपयोग

Awilix को npm के माध्यम से इंस्टॉल करें:

npm install awilix

आइए एक सरल उदाहरण देखें। मान लीजिए हमारे पास यूजर के लिए एक सर्विस है, जो लॉगर और रिपॉजिटरी पर निर्भर है।

const { createContainer, asClass, asFunction, asValue } = require('awilix');

// 1. डिपेंडेंसी परिभाषित करें
class Logger {
    log(message) {
        console.log(`[LOG]: ${message}`);
    }
}

class UserRepository {
    constructor({ logger }) {
        this.logger = logger;
    }

    findById(id) {
        this.logger.log(`ID के साथ यूजर खोजा जा रहा है: ${id}`);
        return { id, name: 'राहुल शर्मा' };
    }
}

class UserService {
    constructor({ userRepository, logger }) {
        this.userRepository = userRepository;
        this.logger = logger;
    }

    getUser(id) {
        this.logger.log('UserService में अनुरोध');
        return this.userRepository.findById(id);
    }
}

// 2. कंटेनर बनाएं और डिपेंडेंसी रजिस्टर करें
const container = createContainer();

container.register({
    logger: asClass(Logger).singleton(),
    userRepository: asClass(UserRepository).singleton(),
    userService: asClass(UserService).singleton()
});

// 3. सर्विस प्राप्त करने के लिए कंटेनर का उपयोग करें
const userService = container.resolve('userService');
const user = userService.getUser(1);
console.log(user);
// आउटपुट:
// [LOG]: UserService में अनुरोध
// [LOG]: ID के साथ यूजर खोजा जा रहा है: 1
// { id: 1, name: 'राहुल शर्मा' }

एडवांस्ड तकनीक: फैक्ट्री और एसिंक्रोनस डिपेंडेंसी

अनुशंसाएँ