C++ में Dependency Injection: शुरुआती के लिए पूरी गाइड

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

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

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

C++ में Dependency Injection क्या है और इसकी ज़रूरत क्यों है?

\n\n

Dependency Injection (DI) ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का एक महत्वपूर्ण सिद्धांत है जो कोड को अधिक लचीला, टेस्ट करने योग्य और मेंटेन करने में आसान बनाता है। अगर आप C++ में नए हैं और "लूज़ कपलिंग" या "इनवर्ज़न ऑफ़ कंट्रोल" जैसे शब्द सुने हैं, लेकिन पूरी तरह नहीं समझे हैं, तो यह लेख आपके लिए है।

\n\n

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

\n\n

समस्या: टाइट कपलिंग (Tight Coupling)

\n\n

मान लीजिए आप नोटिफिकेशन भेजने वाला एक ऐप बना रहे हैं। DI के बिना आपका कोड कुछ इस तरह दिखेगा:

\n\n
#include <iostream>\n#include <string>\n\nclass EmailService {\npublic:\n    void send(const std::string& message) {\n        std::cout << "ईमेल भेजा जा रहा है: " << message << std::endl;\n    }\n};\n\nclass Notification {\nprivate:\n    EmailService emailService;  // कड़ी निर्भरता!\npublic:\n    void notify(const std::string& msg) {\n        emailService.send(msg);\n    }\n};\n\nint main() {\n    Notification notif;\n    notif.notify("Hello, World!");\n    return 0;\n}
\n\n

इस उदाहरण में Notification क्लास EmailService से पूरी तरह बंधी हुई है। अगर आप SMS नोटिफिकेशन या लॉगिंग जोड़ना चाहें, तो Notification क्लास को दोबारा लिखना होगा। ऐसे कोड को टेस्ट करना, विस्तार देना और मेंटेन करना मुश्किल होता है।

\n\n

समाधान: Dependency Injection (डिपेंडेंसी इंजेक्शन)

\n\n

टाइट कपलिंग की समस्या हल करने के लिए हम DI का उपयोग करते हैं। मुख्य विचार यह है कि नोटिफिकेशन सर्विस के लिए एक इंटरफ़ेस (एब्सट्रैक्ट क्लास) बनाएं और इसे Notification क्लास में बाहर से पास करें।

\n\n

चरण 1: एब्सट्रैक्ट इंटरफ़ेस बनाएं

\n\n
#include <iostream>\n#include <string>\n#include <memory>\n\n// सभी नोटिफिकेशन सर्विसेज़ के लिए एब्सट्रैक्ट इंटरफ़ेस\nclass IMessageService {\npublic:\n    virtual ~IMessageService() = default;\n    virtual void send(const std::string& message) = 0;\n};
\n\n

चरण 2: विशिष्ट सर्विसेज़ लागू करें

\n\n
class EmailService : public IMessageService {\npublic:\n    void send(const std::string& message) override {\n        std::cout << "📧 ईमेल: " << message << std::endl;\n    }\n};\n\nclass SMSService : public IMessageService {\npublic:\n    void send(const std::string& message) override {\n        std::cout << "📱 SMS: " << message << std::endl;\n    }\n};
\n\n

चरण 3: कंस्ट्रक्टर के ज़रिए डिपेंडेंसी इंजेक्ट करें

\n\n
class Notification {\nprivate:\n    std::unique_ptr<IMessageService> service;  // डिपेंडेंसी बाहर से आती है\npublic:\n    // कंस्ट्रक्टर इंजेक्शन (Constructor Injection)\n    Notification(std::unique_ptr<IMessageService> svc) \n        : service(std::move(svc)) {}\n    \n    void notify(const std::string& msg) {\n        service->send(msg);\n    }\n};\n\nint main() {\n    // विशिष्ट इम्प्लीमेंटेशन बनाएं\n    auto emailService = std::make_unique<EmailService>();\n    \n    // इसे Notification में इंजेक्ट करें\n    Notification notif(std::move(emailService));\n    notif.notify("Dependency Injection काम कर रहा है!");\n    \n    // आसानी से SMS में बदलें\n    auto smsService = std::make_unique<SMSService>();\n    Notification smsNotif(std::move(smsService));\n    smsNotif.notify("अब SMS के ज़रिए!");\n    \n    return 0;\n}
\n\n

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

\n\n

1. Constructor Injection (कंस्ट्रक्टर के ज़रिए)

\n

यह सबसे आम और अनुशंसित तरीका है। डिपेंडेंसी ऑब्जेक्ट बनाते समय दी जाती हैं और जीवनभर अपरिवर्तित रहती हैं।

\n\n
<                

ब्लॉग

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