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

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

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

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

TypeScript में Dependency Injection: शुरुआती लोगों के लिए

\n\n

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

\n\n

Dependency Injection क्या है?

\n\n

मान लीजिए आप एक कंप्यूटर असेंबल कर रहे हैं। प्रोसेसर को सीधे मदरबोर्ड में फिक्स करने के बजाय, आप एक स्लॉट छोड़ते हैं जिसमें कोई भी कम्पैटिबल प्रोसेसर लगा सकते हैं। Dependency Injection भी इसी सिद्धांत पर काम करता है: क्लास अपनी डिपेंडेंसी (जैसे डेटाबेस या HTTP क्लाइंट) खुद बनाने के बजाय, उन्हें बाहर से प्राप्त करता है।

\n\n

सीधे शब्दों में, DI का मतलब है कि ऑब्जेक्ट अपने "हेल्पर्स" को खुद नहीं बनाता, बल्कि उन्हें कंस्ट्रक्टर या मेथड के ज़रिए तैयार-तैयार लेता है।

\n\n

DI के बिना समस्या: कड़ी निर्भरता (Tight Coupling)

\n\n

आइए एक उदाहरण देखें जो अक्सर रियल प्रोजेक्ट्स में मिलता है:

\n\n
class UserService {\n    private database: MySQLDatabase;\n\n    constructor() {\n        this.database = new MySQLDatabase(); // कड़ी निर्भरता!\n    }\n\n    getUser(id: number) {\n        return this.database.findUserById(id);\n    }\n}
\n\n

यहाँ UserService पूरी तरह MySQLDatabase पर निर्भर है। अगर आप PostgreSQL पर स्विच करना चाहते हैं या फेक डेटाबेस से टेस्ट करना चाहते हैं, तो पूरी क्लास को बदलना होगा। यह SOLID के Open-Closed सिद्धांत का उल्लंघन है।

\n\n

DI के साथ समाधान: लचीलापन और टेस्टेबिलिटी

\n\n

अब उसी क्लास को DI के साथ फिर से लिखते हैं:

\n\n
interface Database {\n    findUserById(id: number): User | null;\n}\n\nclass UserService {\n    constructor(private database: Database) {} // डिपेंडेंसी बाहर से आ रही है\n\n    getUser(id: number) {\n        return this.database.findUserById(id);\n    }\n}\n\n// उपयोग\nconst mySQL = new MySQLDatabase();\nconst service = new UserService(mySQL); // डिपेंडेंसी इंजेक्ट कर रहे हैं
\n\n

अब UserService को नहीं पता कि वह किस डेटाबेस के साथ काम कर रहा है। आप आसानी से MySQLDatabase को PostgreSQLDatabase या टेस्ट के लिए MockDatabase से बदल सकते हैं।

\n\n

डिपेंडेंसी इंजेक्शन के मुख्य तरीके

\n\n

TypeScript में डिपेंडेंसी इंजेक्ट करने के तीन मुख्य तरीके हैं। आइए हर एक को समझते हैं।

\n\n

1. कंस्ट्रक्टर इंजेक्शन (Constructor Injection)

\n\n

यह सबसे आम और अनुशंसित तरीका है। डिपेंडेंसी क्लास के कंस्ट्रक्टर के ज़रिए पास की जाती है।

\n\n
class Logger {\n    log(message: string) {\n        console.log(`[LOG]: ${message}`);\n    }\n}\n\nclass OrderService {\n    constructor(private logger: Logger) {}\n\n    createOrder(data: any) {\n        this.logger.log('ऑर्डर बन गया');\n        // ऑर्डर बनाने की लॉजिक\n    }\n}\n\nconst logger = new Logger();\nconst orderService = new OrderService(logger);
\n\n

2. प्रॉपर्टी इंजेक्शन (Property Injection)

\n\n

डिपेंडेंसी को ऑब्जेक्ट बनने के बाद सीधे उसकी प्रॉपर्टी में सेट किया जाता है। इसका उपयोग कम होता है क्योंकि इससे ऑब्जेक्ट अधूरा रह सकता है।

\n\n
class EmailService {\n    sendEmail(to: string, message: string) {\n        console.log(`${to} को ईमेल भेजा गया: ${message}`);\n    }\n}\n\nclass NotificationService {\n    emailService!: EmailService; // टाइप एश्योरेंस\n\n    notifyUser(user: string) {\n        this.emailService.sendEmail(user, 'नमस्ते!');\n    }\n}\n\nconst notification = new NotificationService();\nnotification.emailService = new EmailService(); // प्रॉपर्टी सेट कर रहे हैं\nnotification.notifyUser('user@example.com');
\n\n

3. मेथड इंजेक्शन (Method Injection)

\n

ब्लॉग

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