C# में Dependency Injection (DI) क्या है और इसकी आवश्यकता क्यों है?
\n\nDependency Injection (डिपेंडेंसी इंजेक्शन) एक डिज़ाइन पैटर्न है जो कोड को अधिक लचीला, टेस्ट करने योग्य और मेंटेन करने में आसान बनाता है। क्लास खुद उन ऑब्जेक्ट्स को बनाने के बजाय जिन पर वह निर्भर है, ये ऑब्जेक्ट्स बाहर से "इंजेक्ट" किए जाते हैं। यह C# और .NET में आधुनिक डेवलपमेंट के मुख्य सिद्धांतों में से एक है।
\n\nमान लीजिए आप ईमेल नोटिफिकेशन भेजने के लिए एक ऐप बना रहे हैं। यदि आपकी NotificationService क्लास सीधे SmtpClient का इंस्टेंस बनाती है, तो मेल सर्वर बदलने या दूसरे तरीके (जैसे API) से भेजने पर आपको कोड फिर से लिखना पड़ेगा। DI इस समस्या को हल करता है।
Dependency Injection के बिना समस्या
\n\nआइए खराब कोड का एक सामान्य उदाहरण देखें, जहां डिपेंडेंसी क्लास के अंदर ही बनाई गई है:
\n\npublic class EmailService\n{\n private SmtpClient _smtpClient;\n\n public EmailService()\n {\n // एक विशिष्ट इम्प्लीमेंटेशन से कड़ा जुड़ाव\n _smtpClient = new SmtpClient("smtp.gmail.com", 587);\n }\n\n public void SendEmail(string to, string subject, string body)\n {\n // भेजने की लॉजिक\n }\n}\n\npublic class NotificationService\n{\n private EmailService _emailService;\n\n public NotificationService()\n {\n _emailService = new EmailService(); // कड़ा जुड़ाव\n }\n\n public void NotifyUser(string email)\n {\n _emailService.SendEmail(email, "सूचना", "नमस्ते!");\n }\n}\n\nइस तरीके की कमियां:
\n- \n
- उच्च कपलिंग (tight coupling):
NotificationServiceऔरEmailServiceक्लासेज़ एक-दूसरे से कड़ी जुड़ी हुई हैं। \n - टेस्टिंग में कठिनाई: यूनिट टेस्टिंग के दौरान
EmailServiceको मॉक ऑब्जेक्ट से बदलना संभव नहीं है। \n - विस्तार में कठिनाई: अगर SMS नोटिफिकेशन जोड़ना हो, तो
NotificationServiceके अंदर लॉजिक बदलना पड़ेगा। \n
C# में Dependency Injection का कार्यान्वयन
\n\nDI इन समस्याओं को तीन मुख्य तरीकों से हल करता है: कंस्ट्रक्टर इंजेक्शन, प्रॉपर्टी इंजेक्शन और मेथड इंजेक्शन। सबसे आम और अनुशंसित तरीका है कंस्ट्रक्टर इंजेक्शन (Constructor Injection)।
\n\nचरण 1. इंटरफ़ेस बनाएं
\nपहले एक एब्स्ट्रैक्शन (इंटरफ़ेस) बनाएं जो संदेश भेजने के लिए कॉन्ट्रैक्ट को परिभाषित करता है:
\n\npublic interface IMessageSender\n{\n void Send(string to, string message);\n}\n\nचरण 2. विशिष्ट सेवाएं लागू करें
\nअब इस इंटरफ़ेस की कई इम्प्लीमेंटेशन बनाएं:
\n\npublic class EmailSender : IMessageSender\n{\n public void Send(string to, string message)\n {\n Console.WriteLine($"ईमेल भेजा जा रहा है {to} पर: {message}");\n }\n}\n\npublic class SmsSender : IMessageSender\n{\n public void Send(string to, string message)\n {\n Console.WriteLine($"SMS भेजा जा रहा है {to} पर: {message}");\n }\n}\n\nचरण 3. कंस्ट्रक्टर के जरिए DI लागू करें
\nअब NotificationService क्लास खुद डिपेंडेंसी नहीं बनाती, बल्कि उन्हें कंस्ट्रक्टर के जरिए प्राप्त करती है:
public class NotificationService\n{\n private readonly IMessageSender _messageSender;\n\n // कंस्ट्रक्टर के जरिए डिपेंडेंसी इंजेक्शन\n public NotificationService(IMessageSender messageSender)\n {\n _messageSender = messageSender;\n }\n\n public void Notify(string userContact, string message)\n {\n _messageSender.Send(userContact, message);\n }\n}\n\nअब हम आसानी से इम्प्लीमेंटेशन बदल सकते हैं:
\n\n// Email का उपयोग करें\nvar emailSender = new EmailSender();\nvar emailNotifier = new NotificationService(emailSender);\nemailNotifier.Notify("user@example.com", "ईमेल के जरिए नमस्ते!");\n\n// SMS का उपयोग करें\nvar sms