C# (.NET) के लिए Dependency Injection कंटेनर: पूर्ण गाइड
Dependency Injection (DI) C# (.NET) में आधुनिक विकास के प्रमुख सिद्धांतों में से एक है, जो कम-युग्मित, परीक्षण योग्य और आसानी से रखरखाव योग्य एप्लिकेशन बनाने में सक्षम बनाता है। .NET इकोसिस्टम में, DI को लागू करने का मुख्य उपकरण Microsoft.Extensions.DependencyInjection पैकेज का अंतर्निहित कंटेनर है। इस लेख में, हम विस्तार से समझेंगे कि DI कंटेनर क्या है, इसे कैसे कॉन्फ़िगर करें, कौन से जीवनचक्र मौजूद हैं, और वास्तविक प्रोजेक्ट्स में इसका सही उपयोग कैसे करें।
Dependency Injection कंटेनर क्या है?
Dependency Injection कंटेनर (या IoC-कंटेनर) एक सॉफ्टवेयर घटक है जो स्वचालित रूप से ऑब्जेक्ट्स की डिपेंडेंसी के निर्माण और इंजेक्शन का प्रबंधन करता है। new का उपयोग करके मैन्युअल रूप से ऑब्जेक्ट बनाने के बजाय, आप कंटेनर में प्रकारों को पंजीकृत करते हैं, और यह स्वयं उनके निर्माण और जुड़ाव का ध्यान रखता है।
DI कंटेनर का उपयोग करने के मुख्य लाभ:
- कोड युग्मन में कमी — क्लासेस ठोस कार्यान्वयन के बजाय एब्स्ट्रैक्शन (इंटरफेस) पर निर्भर करती हैं।
- परीक्षण में सरलता — डिपेंडेंसी को mock-ऑब्जेक्ट से बदलना आसान है।
- जीवनचक्र का केंद्रीकृत प्रबंधन — आप नियंत्रित करते हैं कि ऑब्जेक्ट कब बनाए और नष्ट किए जाते हैं।
- लचीलापन बढ़ाना — उपभोक्ता कोड को बदले बिना कार्यान्वयन बदला जा सकता है।
DI कंटेनर की स्थापना और कॉन्फ़िगरेशन
आधुनिक .NET प्रोजेक्ट्स (ASP.NET Core, Console, Worker Services) में, DI कंटेनर पहले से ही अंतर्निहित है। इसका उपयोग करने के लिए, प्रोजेक्ट में पैकेज जोड़ना पर्याप्त है:
dotnet add package Microsoft.Extensions.DependencyInjectionइसके बाद, IServiceCollection का एक इंस्टेंस बनाया जाता है, जिसमें सभी डिपेंडेंसी पंजीकृत की जाती हैं। आइए सेवा पंजीकरण का एक सरल उदाहरण देखें:
using Microsoft.Extensions.DependencyInjection;
// इंटरफ़ेस और उसका कार्यान्वयन परिभाषित करेंpublic interface IMessageService{ void Send(string message);}
public class EmailService : IMessageService{ public void Send(string message) { Console.WriteLine($"Email sent: {message}"); }}
// कंटेनर कॉन्फ़िगरेशनvar services = new ServiceCollection();services.AddTransient<IMessageService, EmailService>();
// सेवा प्रदाता बनाएंvar serviceProvider = services.BuildServiceProvider();
// सेवा का इंस्टेंस प्राप्त करेंvar messageService = serviceProvider.GetService<IMessageService>();messageService.Send("Hello from DI!");डिपेंडेंसी के जीवनचक्र
DI कंटेनर ऑब्जेक्ट जीवनकाल प्रबंधन के तीन मुख्य मोड का समर्थन करता है:
- Transient (AddTransient) — प्रत्येक अनुरोध एक नया इंस्टेंस बनाता है। स्थिति रहित हल्की सेवाओं के लिए उपयुक्त।
- Scoped (AddScoped) — प्रति स्कोप एक इंस्टेंस (उदाहरण के लिए, ASP.NET Core में HTTP अनुरोध)। एक ऑपरेशन के दायरे में स्थिति वाली सेवाओं के लिए आदर्श।
- Singleton (AddSingleton) — पूरे एप्लिकेशन के लिए एक ही इंस्टेंस। कैश, लॉगर, कॉन्फ़िगरेशन के लिए उपयोग किया जाता है।
विभिन्न जीवनचक्रों के साथ पंजीकरण का उदाहरण:
services.AddTransient<ITransientService, TransientService>();services.AddScoped<IScopedService, ScopedService>();services.AddSingleton<ISingletonService, SingletonService>();महत्वपूर्ण: यदि कोई सेवा छोटे जीवनचक्र वाली किसी अन्य सेवा पर निर्भर करती है, तो इससे त्रुटियाँ हो सकती हैं (उदाहरण के लिए, Singleton जो Scoped का उपयोग करता है)। ऐसी स्थितियों को "captive dependencies" कहा जाता है और इनसे बचना चाहिए।
कंस्ट्रक्टर के माध्यम से डिपेंडेंसी इंजेक्शन
इंजेक्शन का सबसे सामान्य तरीका कंस्ट्रक्टर के माध्यम से है। कंटेनर स्वचालित रूप से सभी निर्भरताओं को हल करता है