IServiceCollection
ইন্টারফেসের জন্য ব্যবহার করা হয় বিল্ডিং নির্ভরশীলতার ইনজেকশন ধারক। এটি সম্পূর্ণরূপে নির্মিত হওয়ার পরে, এটি কোনও IServiceProvider
উদাহরণের সাথে রচিত হয় যা আপনি পরিষেবাগুলি সমাধান করতে ব্যবহার করতে পারেন। আপনি যে IServiceProvider
কোনও ক্লাসে একটি ইনজেক্ট করতে পারেন । IApplicationBuilder
এবং HttpContext
শ্রেণীর পাশাপাশি সেবা প্রদানকারী প্রদান করতে পারেন, তাদের মাধ্যমে ApplicationServices
অথবা RequestServices
যথাক্রমে বৈশিষ্ট্য।
IServiceProvider
GetService(Type type)
কোনও পরিষেবা সমাধানের জন্য একটি পদ্ধতি নির্ধারণ করে :
var service = (IFooService)serviceProvider.GetService(typeof(IFooService));
এ ছাড়াও আরও অনেক সুবিধা এক্সটেনশন যেমন প্রাপ্তিসাধ্য পদ্ধতি, হয় serviceProvider.GetService<IFooService>()
(ক যোগ using
জন্য 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);
}
ম্যানুয়ালি সল্ভিং সার্ভিসেস (ওরফে সার্ভিস লোকেটার) সাধারণত একটি অ্যান্টি-প্যাটার্ন হিসাবে বিবেচিত হয় । যদিও এটির ব্যবহারের ক্ষেত্রে (ফ্রেমওয়ার্ক এবং / বা অবকাঠামো স্তরগুলির জন্য) রয়েছে, আপনার যতটা সম্ভব এড়ানো উচিত।