IServiceCollection
इंटरफेस के लिए प्रयोग किया जाता है के निर्माण के एक निर्भरता इंजेक्शन कंटेनर। पूरी तरह से निर्मित होने के बाद, यह एक IServiceProvider
ऐसे उदाहरण से बना है जिसका उपयोग आप सेवाओं को हल करने के लिए कर सकते हैं। आप IServiceProvider
किसी भी वर्ग में इंजेक्शन लगा सकते हैं । IApplicationBuilder
और HttpContext
वर्ग के रूप में अच्छी तरह से सेवा प्रदाता प्रदान कर सकते हैं, उनके माध्यम से ApplicationServices
या RequestServices
क्रमशः गुण।
IServiceProvider
GetService(Type type)
एक सेवा को हल करने के लिए एक विधि को परिभाषित करता है :
var service = (IFooService)serviceProvider.GetService(typeof(IFooService));
कई सुविधा विस्तार विधियाँ भी उपलब्ध हैं, जैसे serviceProvider.GetService<IFooService>()
( using
for 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);
}
मैन्युअल रूप से हल करने वाली सेवाओं (उर्फ सेवा लोकेटर) को आमतौर पर एक विरोधी पैटर्न माना जाता है । हालांकि, इसके उपयोग-मामले (चौखटे और / या बुनियादी ढांचे की परतों के लिए) हैं, आपको इससे जितना संभव हो उतना बचना चाहिए।