IServiceCollectionइंटरफेस के लिए प्रयोग किया जाता है के निर्माण के एक निर्भरता इंजेक्शन कंटेनर। पूरी तरह से निर्मित होने के बाद, यह एक IServiceProviderऐसे उदाहरण से बना है जिसका उपयोग आप सेवाओं को हल करने के लिए कर सकते हैं। आप IServiceProviderकिसी भी वर्ग में इंजेक्शन लगा सकते हैं । IApplicationBuilderऔर HttpContextवर्ग के रूप में अच्छी तरह से सेवा प्रदाता प्रदान कर सकते हैं, उनके माध्यम से ApplicationServicesया RequestServicesक्रमशः गुण।
IServiceProviderGetService(Type type)एक सेवा को हल करने के लिए एक विधि को परिभाषित करता है :
var service = (IFooService)serviceProvider.GetService(typeof(IFooService));
कई सुविधा विस्तार विधियाँ भी उपलब्ध हैं, जैसे serviceProvider.GetService<IFooService>()( usingfor a Microsoft.Extensions.DependencyInjection) जोड़ें ।
स्टार्टअप क्लास के अंदर सेवाओं को हल करना
निर्भरता का इंजेक्शन
क्रम को होस्ट करने वाली सेवा प्रदाता के निर्माता में कुछ सेवाओं इंजेक्षन कर सकते हैं Startupजैसे वर्ग, IConfiguration,
IWebHostEnvironment( IHostingEnvironmentपूर्व -3.0 संस्करणों में), ILoggerFactoryऔर IServiceProvider। ध्यान दें कि उत्तरार्द्ध होस्टिंग परत द्वारा निर्मित एक उदाहरण है और इसमें एक आवेदन शुरू करने के लिए केवल आवश्यक सेवाएं शामिल हैं ।
ConfigureServices()विधि सेवाओं इंजेक्शन लगाने की अनुमति नहीं है, यह केवल एक को स्वीकार करता है IServiceCollectionतर्क। यह समझ में आता है क्योंकि ConfigureServices()आप अपने आवेदन के लिए आवश्यक सेवाओं को पंजीकृत करते हैं। हालाँकि आप स्टार्टअप के निर्माता के यहाँ इंजेक्ट की गई सेवाओं का उपयोग कर सकते हैं, उदाहरण के लिए:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
// Use Configuration here
}
ConfigureServices()तब पंजीकृत किसी भी सेवा को Configure()विधि में अंतःक्षिप्त किया जा सकता है ; आप IApplicationBuilderपैरामीटर के बाद सेवाओं की एक मनमानी संख्या जोड़ सकते हैं :
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IFooService>();
}
public void Configure(IApplicationBuilder app, IFooService fooService)
{
fooService.Bar();
}
मैन्युअल रूप से निर्भरता को हल करना
आप मैन्युअल रूप से संकल्प सेवाओं की जरूरत है, तो आप बेहतर उपयोग करना चाहिए ApplicationServicesप्रदान की द्वारा IApplicationBuilderमें Configure()विधि:
public void Configure(IApplicationBuilder app)
{
var serviceProvider = app.ApplicationServices;
var hostingEnv = serviceProvider.GetService<IHostingEnvironment>();
}
IServiceProviderअपनी Startupकक्षा के कंस्ट्रक्टर में पास और सीधे उपयोग करना संभव है , लेकिन ऊपर से इसमें सेवाओं का एक सीमित उपसमूह शामिल होगा , और इस प्रकार इसकी सीमित उपयोगिता है:
public Startup(IServiceProvider serviceProvider)
{
var hostingEnv = serviceProvider.GetService<IWebHostEnvironment>();
}
यदि आपको ConfigureServices()विधि में सेवाओं का समाधान करना चाहिए , तो एक अलग दृष्टिकोण की आवश्यकता होती है। आप IServiceProviderउस IServiceCollectionउदाहरण से एक मध्यवर्ती बना सकते हैं जिसमें ऐसी सेवाएं शामिल हैं जिन्हें उस बिंदु तक पंजीकृत किया गया है :
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IFooService, FooService>();
// Build the intermediate service provider
var sp = services.BuildServiceProvider();
// This will succeed.
var fooService = sp.GetService<IFooService>();
// This will fail (return null), as IBarService hasn't been registered yet.
var barService = sp.GetService<IBarService>();
}
कृपया ध्यान दें:
आम तौर पर आपको ConfigureServices()विधि के अंदर सेवाओं को हल करने से बचना चाहिए , क्योंकि यह वास्तव में वह जगह है जहां आप एप्लिकेशन सेवाओं को कॉन्फ़िगर कर रहे हैं । कभी-कभी आपको केवल एक IOptions<MyOptions>उदाहरण तक पहुंच की आवश्यकता होती है । आप इसे IConfigurationउदाहरण से उदाहरण के लिए MyOptions(जो अनिवार्य रूप से विकल्प रूपरेखा क्या करता है) मानों को बांधकर पूरा कर सकते हैं :
public void ConfigureServices(IServiceCollection services)
{
var myOptions = new MyOptions();
Configuration.GetSection("SomeSection").Bind(myOptions);
}
मैन्युअल रूप से हल करने वाली सेवाओं (उर्फ सेवा लोकेटर) को आमतौर पर एक विरोधी पैटर्न माना जाता है । हालांकि, इसके उपयोग-मामले (चौखटे और / या बुनियादी ढांचे की परतों के लिए) हैं, आपको इससे जितना संभव हो उतना बचना चाहिए।