আমার কাছে পরিষেবা রয়েছে যা একই ইন্টারফেস থেকে প্রাপ্ত।
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
সাধারণত, অন্যান্য আইওসি পাত্রে যেমন Unity
আপনাকে কিছু Key
আলাদা করে তাদের দ্বারা কংক্রিট বাস্তবায়নগুলি নিবন্ধন করতে দেয় ।
এএসপি.নেট কোরে, আমি কীভাবে কীগুলির উপর ভিত্তি করে এই পরিষেবাগুলি নিবন্ধভুক্ত করব এবং রানটাইমগুলিতে সেগুলি সমাধান করব?
আমি কোনও Add
পরিষেবা পদ্ধতি দেখতে পাচ্ছি না যা একটি key
বা name
পরামিতি গ্রহণ করে, যা সাধারণত কংক্রিট বাস্তবায়নের পার্থক্য করতে ব্যবহৃত হত।
public void ConfigureServices(IServiceCollection services)
{
// How do I register services of the same interface?
}
public MyController:Controller
{
public void DoSomething(string key)
{
// How do I resolve the service by key?
}
}
কারখানার প্যাটার্নটি কি এখানে একমাত্র বিকল্প?
Update1
আমি যদিও নিবন্ধ চলে গেছে এখানে যে দেখায় কিভাবে কারখানা প্যাটার্ন ব্যবহার করতে Service দৃষ্টান্ত পেতে আমরা একাধিক কংক্রিট বাস্তবায়নের আছে। তবে এটি এখনও সম্পূর্ণ সমাধান নয়। আমি যখন _serviceProvider.GetService()
পদ্ধতিটি কল করি তখন আমি কনস্ট্রাক্টরের মধ্যে ডেটা ইনজেক্ট করতে পারি না।
উদাহরণস্বরূপ এটি বিবেচনা করুন:
public class ServiceA : IService
{
private string _efConnectionString;
ServiceA(string efconnectionString)
{
_efConnecttionString = efConnectionString;
}
}
public class ServiceB : IService
{
private string _mongoConnectionString;
public ServiceB(string mongoConnectionString)
{
_mongoConnectionString = mongoConnectionString;
}
}
public class ServiceC : IService
{
private string _someOtherConnectionString
public ServiceC(string someOtherConnectionString)
{
_someOtherConnectionString = someOtherConnectionString;
}
}
কিভাবে _serviceProvider.GetService()
উপযুক্ত সংযোগ স্ট্রিং ইনজেক্ট করতে পারেন ? ইউনিটিতে, বা অন্য কোনও আইওসি লাইব্রেরিতে, আমরা এটি টাইপ রেজিস্ট্রেশনে করতে পারি। আমি আইওপশনটি ব্যবহার করতে পারি , তবে এর জন্য আমাকে সমস্ত সেটিংস ইনজেক্ট করতে হবে। আমি পরিষেবাটিতে কোনও নির্দিষ্ট সংযোগ স্ট্রিং ইনজেক্ট করতে পারি না।
এছাড়াও নোট করুন যে আমি অন্যান্য পাত্রে (ityক্য সহ) ব্যবহার এড়াতে চাইছি কারণ তখন নতুন কন্টেইনারে আমাকে অন্য সমস্ত কিছু (যেমন কন্ট্রোলার )ও নিবন্ধ করতে হবে।
এছাড়াও, পরিষেবা দৃষ্টান্ত তৈরি করতে কারখানার প্যাটার্নটি ব্যবহার করা ডিআইপি-র বিপক্ষে, কারণ এখানে কোনও ক্লায়েন্টের বিশদ থাকা নির্ভরতার সংখ্যা বৃদ্ধি করে ।
সুতরাং, আমি মনে করি এএসপি.নেট কোরের ডিফল্ট ডিআই দুটি জিনিস হারিয়েছে:
- একটি কী ব্যবহার করে দৃষ্টান্ত নিবন্ধ করার ক্ষমতা
- নিবন্ধের সময় কনস্টাক্টরে স্থির ডেটা ইনজেক্ট করার ক্ষমতা
Update1
কনস্ট্রাক্টরগুলিতে ইনজেকশনের জিনিসগুলি যা তৈরি করতে হবে তা নির্ধারণের চেয়ে খুব আলাদা