TypeScript में Dependency Injection: शुरुआती लोगों के लिए
\n\nसॉफ्टवेयर डेवलपमेंट की दुनिया में आपने अक्सर Dependency Injection (DI) शब्द सुना होगा। TypeScript में नए डेवलपर्स के लिए यह थोड़ा जटिल लग सकता है, लेकिन असल में यह एक सरल और शक्तिशाली पैटर्न है जो आपके कोड को साफ, टेस्टेबल और मेंटेन करने में आसान बनाता है। इस लेख में हम जानेंगे कि DI क्या है, इसकी ज़रूरत क्यों है, और TypeScript में इसे कैसे इस्तेमाल करें।
\n\nDependency Injection क्या है?
\n\nमान लीजिए आप एक कंप्यूटर असेंबल कर रहे हैं। प्रोसेसर को सीधे मदरबोर्ड में फिक्स करने के बजाय, आप एक स्लॉट छोड़ते हैं जिसमें कोई भी कम्पैटिबल प्रोसेसर लगा सकते हैं। Dependency Injection भी इसी सिद्धांत पर काम करता है: क्लास अपनी डिपेंडेंसी (जैसे डेटाबेस या HTTP क्लाइंट) खुद बनाने के बजाय, उन्हें बाहर से प्राप्त करता है।
\n\nसीधे शब्दों में, DI का मतलब है कि ऑब्जेक्ट अपने "हेल्पर्स" को खुद नहीं बनाता, बल्कि उन्हें कंस्ट्रक्टर या मेथड के ज़रिए तैयार-तैयार लेता है।
\n\nDI के बिना समस्या: कड़ी निर्भरता (Tight Coupling)
\n\nआइए एक उदाहरण देखें जो अक्सर रियल प्रोजेक्ट्स में मिलता है:
\n\nclass 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 सिद्धांत का उल्लंघन है।
DI के साथ समाधान: लचीलापन और टेस्टेबिलिटी
\n\nअब उसी क्लास को DI के साथ फिर से लिखते हैं:
\n\ninterface 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\nTypeScript में डिपेंडेंसी इंजेक्ट करने के तीन मुख्य तरीके हैं। आइए हर एक को समझते हैं।
\n\n1. कंस्ट्रक्टर इंजेक्शन (Constructor Injection)
\n\nयह सबसे आम और अनुशंसित तरीका है। डिपेंडेंसी क्लास के कंस्ट्रक्टर के ज़रिए पास की जाती है।
\n\nclass 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\n2. प्रॉपर्टी इंजेक्शन (Property Injection)
\n\nडिपेंडेंसी को ऑब्जेक्ट बनने के बाद सीधे उसकी प्रॉपर्टी में सेट किया जाता है। इसका उपयोग कम होता है क्योंकि इससे ऑब्जेक्ट अधूरा रह सकता है।
\n\nclass 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