ASP.NET Core का अंतर्निहित IoC (Inversion of Control) कंटेनर रजिस्टर्ड सर्विस टाइप के लाइफटाइम को प्रबंधित करता है। यह निर्दिष्ट लाइफटाइम के आधार पर सर्विस इंस्टेंस को स्वचालित रूप से डिस्पोज करता है।
IoC कंटेनर द्वारा समर्थित तीन प्रकार के लाइफटाइम
1. Singleton (सिंगलटन)
IoC कंटेनर एप्लिकेशन के पूरे लाइफटाइम के दौरान सर्विस का एक ही इंस्टेंस बनाता है और शेयर करता है। सभी रिक्वेस्ट इसी एक इंस्टेंस का उपयोग करते हैं।
2. Transient (ट्रांजिएंट)
हर बार जब सर्विस मांगी जाती है, IoC कंटेनर निर्दिष्ट सर्विस टाइप का एक नया इंस्टेंस बनाता है। प्रत्येक रिक्वेस्ट को अलग इंस्टेंस मिलता है।
3. Scoped (स्कोप्ड)
IoC कंटेनर प्रति रिक्वेस्ट एक बार सर्विस टाइप का इंस्टेंस बनाता है और उसी रिक्वेस्ट के भीतर इसे शेयर किया जाता है। अलग-अलग रिक्वेस्ट को अलग इंस्टेंस मिलते हैं।
कोड उदाहरण
इंटरफेस और इम्प्लीमेंटेशन
public interface ILog
{
void Info(string str);
}
class MyConsoleLogger : ILog
{
public void Info(string str)
{
Console.WriteLine(str);
}
}
ServiceDescriptor का उपयोग करके रजिस्ट्रेशन
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Singleton - मैन्युअली इंस्टेंस बनाकर
services.Add(new ServiceDescriptor(typeof(ILog), new MyConsoleLogger()));
// Transient
services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Transient));
// Scoped
services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Scoped));
}
}
एक्सटेंशन मेथड्स का उपयोग करके रजिस्ट्रेशन (अनुशंसित तरीका)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Singleton रजिस्ट्रेशन
services.AddSingleton<ILog, MyConsoleLogger>();
services.AddSingleton(typeof(ILog), typeof(MyConsoleLogger));
// Transient रजिस्ट्रेशन
services.AddTransient<ILog, MyConsoleLogger>();
services.AddTransient(typeof(ILog), typeof(MyConsoleLogger));
// Scoped रजिस्ट्रेशन
services.AddScoped<ILog, MyConsoleLogger>();
services.AddScoped(typeof(ILog), typeof(MyConsoleLogger));
}
}
कौन सा लाइफटाइम चुनें?
- Singleton: स्टेटलेस सर्विसेज, कैशिंग, कॉन्फिगरेशन के लिए उपयुक्त
- Transient: हल्की, स्टेटलेस सर्विसेज के लिए जो हर बार नई होनी चाहिए
- Scoped: डेटाबेस कॉन्टेक्स्ट, यूजर-स्पेसिफिक डेटा, रिक्वेस्ट-स्कोप्ड ऑपरेशन्स के लिए आदर्श
ध्यान दें: Scoped सर्विसेज को Singleton में इंजेक्ट न करें, अन्यथा यह कैप्टिव डिपेंडेंसी समस्या पैदा कर सकता है।