এটি লক্ষ করা উচিত যে প্রস্তাবিত উপায়টি বিকল্প প্যাটার্নটি ব্যবহার করা । তবে এমন ব্যবহারের কেস রয়েছে যেখানে এর অযৌক্তিক (যখন পরামিতিগুলি কেবল রানটাইমের সময় জানা থাকে, শুরু / সংকলনের সময় নয়) বা আপনাকে গতিশীলভাবে নির্ভরতা প্রতিস্থাপন করতে হবে।
এটি খুব কার্যকর যখন আপনার কোনও একক নির্ভরতা (এটি স্ট্রিং, পূর্ণসংখ্যা বা অন্য ধরণের নির্ভরতা প্রতিস্থাপনের প্রয়োজন হয়) বা কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করার সময় যা কেবল স্ট্রিং / ইন্টিজার পরামিতি গ্রহণ করে এবং আপনার রানটাইম প্যারামিটার প্রয়োজন।
আপনি শর্টকাট হ্যান্ড হিসাবে ক্রিয়েটইনস্ট্যান্স (আইএসভারসপ্রাইডার, অবজেক্ট []) চেষ্টা করে দেখতে পারেন ( এটি স্ট্রিং প্যারামিটার / মান ধরণের / আদিম (ইন্ট, ফ্লোট, স্ট্রিং), অনির্ধারিত) দিয়ে কাজ করে তা নিশ্চিত নয়) এমনকি এটি ব্যবহার করেও এটির কাজটি নিশ্চিত করেছে একাধিক স্ট্রিং পরামিতি) হাত দ্বারা প্রতিটি একক নির্ভরতা সমাধানের পরিবর্তে:
_serviceCollection.AddSingleton<IService>(x =>
ActivatorUtilities.CreateInstance<Service>(x, "");
);
প্যারামিটারগুলি ( CreateInstance<T>
/ এর শেষ প্যারামিটার CreateInstance
) পরামিতিগুলি সংজ্ঞায়িত করে যা প্রতিস্থাপন করা উচিত (সরবরাহকারী থেকে সমাধান করা হয়নি)। এগুলি প্রদর্শিত হওয়ার সাথে সাথে এগুলি বাম থেকে ডানে প্রয়োগ করা হয় (যেমন প্রথম স্ট্রিংটি ইনস্ট্যান্ট করার জন্য টাইপের প্রথম স্ট্রিং-টাইপযুক্ত প্যারামিটারের সাথে প্রতিস্থাপন করা হবে)।
ActivatorUtilities.CreateInstance<Service>
পরিষেবাটি সমাধান করতে এবং এই একক সক্রিয়করণের জন্য একটি ডিফল্ট রেজিস্ট্রেশনগুলির একটি প্রতিস্থাপন করতে অনেক জায়গায় ব্যবহৃত হয়।
উদাহরণস্বরূপ যদি আপনি কোন ক্লাসে নামে আছে MyService
, এবং এটি রয়েছে IOtherService
, ILogger<MyService>
নির্ভরতা এবং আপনি পরিষেবা সমাধান কিন্তু ডিফল্ট সেবা প্রতিস্থাপন করতে চান IOtherService
(তার বলে OtherServiceA
) সঙ্গে OtherServiceB
, আপনি ভালো কিছু করতে পারে:
myService = ActivatorUtilities.CreateInstance<Service>(serviceProvider, new OtherServiceB())
তারপর প্রথম প্যারামিটার IOtherService
হবে OtherServiceB
বদলে ইনজেকশনের, OtherServiceA
কিন্তু অবশিষ্ট পরামিতি ধারক থেকে আসতে হবে।
এটি আপনার পক্ষে যখন অনেক নির্ভরতা থাকে এবং কেবলমাত্র একটির সাথে বিশেষভাবে চিকিত্সা করতে চান (যেমন অনুরোধের সময় বা কোনও নির্দিষ্ট ব্যবহারকারীর জন্য একটি ডাটাবেস নির্দিষ্ট সরবরাহকারীর প্রতিস্থাপন করতে চান, যা আপনি রান চালানোর সময় এবং একটি অনুরোধকালে জানেন এবং অ্যাপ্লিকেশন নির্মিত / শুরু হওয়ার সময় নয়)।
আপনি পরিবর্তে কারখানা পদ্ধতি তৈরির জন্য অ্যাক্টিভেটর ইউটিলিটিস .স ক্রিয়েট ফ্যাক্টরি (প্রকার, প্রকার []) পদ্ধতিটিও ব্যবহার করতে পারেন, কারণ এটি গিটহাব রেফারেন্স এবং বেঞ্চমার্কের আরও ভাল পারফরম্যান্স সরবরাহ করে ।
পরে যখন টাইপটি খুব ঘন ঘন সমাধান করা হয় তখন এটি কার্যকর হয় (যেমন সিগন্যালআর এবং অন্যান্য উচ্চ অনুরোধের পরিস্থিতিতে)। মূলত আপনি একটি ObjectFactory
মাধ্যমে তৈরি করতে চাই
var myServiceFactory = ActivatorUtilities.CreateFactory(typeof(MyService), new[] { typeof(IOtherService) });
তারপরে এটি ক্যাশে করুন (পরিবর্তনশীল ইত্যাদি হিসাবে) এবং যেখানে প্রয়োজন সেখানে এটি কল করুন
MyService myService = myServiceFactory(serviceProvider, myServiceOrParameterTypeToReplace);
## আপডেট: এটির স্ট্রিং এবং পূর্ণসংখ্যার সাথে এটি কাজ করছে তা নিশ্চিত করার জন্য আমি নিজে চেষ্টা করেছি এবং এটি সত্যিই কাজ করে। এখানে আমি যে দৃ concrete় উদাহরণটি পরীক্ষা করেছি তা এখানে:
class Program
{
static void Main(string[] args)
{
var services = new ServiceCollection();
services.AddTransient<HelloWorldService>();
services.AddTransient(p => p.ResolveWith<DemoService>("Tseng", "Stackoverflow"));
var provider = services.BuildServiceProvider();
var demoService = provider.GetRequiredService<DemoService>();
Console.WriteLine($"Output: {demoService.HelloWorld()}");
Console.ReadKey();
}
}
public class DemoService
{
private readonly HelloWorldService helloWorldService;
private readonly string firstname;
private readonly string lastname;
public DemoService(HelloWorldService helloWorldService, string firstname, string lastname)
{
this.helloWorldService = helloWorldService ?? throw new ArgumentNullException(nameof(helloWorldService));
this.firstname = firstname ?? throw new ArgumentNullException(nameof(firstname));
this.lastname = lastname ?? throw new ArgumentNullException(nameof(lastname));
}
public string HelloWorld()
{
return this.helloWorldService.Hello(firstName, lastName);
}
}
public class HelloWorldService
{
public string Hello(string name) => $"Hello {name}";
public string Hello(string firstname, string lastname) => $"Hello {firstname} {lastname}";
}
static class ServiceProviderExtensions
{
public static T ResolveWith<T>(this IServiceProvider provider, params object[] parameters) where T : class =>
ActivatorUtilities.CreateInstance<T>(provider, parameters);
}
প্রিন্ট
Output: Hello Tseng Stackoverflow