मेरे पास ऐसी सेवाएं हैं जो एक ही इंटरफ़ेस से ली गई हैं।
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
आमतौर पर, अन्य IoC कंटेनर Unity
आपको कुछ Key
अलग करके ठोस कार्यान्वयन दर्ज करने की अनुमति देते हैं।
ASP.NET Core में, मैं इन सेवाओं को कैसे पंजीकृत करूँ और कुछ समय के आधार पर इन्हें रनटाइम में हल करूँ?
मुझे ऐसी कोई 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?
}
}
क्या फ़ैक्टरी पैटर्न यहाँ एकमात्र विकल्प है?
अपडेट 1
मैं हालांकि यहां लेख गया हूं जो दिखाता है कि जब हम कई ठोस कार्यान्वयन करते हैं, तो सेवा उदाहरण प्राप्त करने के लिए फ़ैक्टरी पैटर्न का उपयोग कैसे करें। हालाँकि, यह अभी भी एक पूर्ण समाधान नहीं है। जब मैं _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()
उपयुक्त कनेक्शन स्ट्रिंग को कैसे इंजेक्ट कर सकते हैं ? एकता, या किसी अन्य IoC पुस्तकालय में, हम उस प्रकार के पंजीकरण में कर सकते हैं। मैं IOption का उपयोग कर सकता हूं , हालांकि, मुझे सभी सेटिंग्स को इंजेक्ट करने की आवश्यकता होगी। मैं किसी विशेष कनेक्शन स्ट्रिंग को सेवा में इंजेक्ट नहीं कर सकता।
यह भी ध्यान दें कि मैं अन्य कंटेनरों (एकता सहित) का उपयोग करने से बचने की कोशिश कर रहा हूं, क्योंकि तब मुझे नए कंटेनर के साथ और सब कुछ (जैसे, नियंत्रक) को पंजीकृत करना होगा।
इसके अलावा, सर्विस इंस्ट्रूमेंट बनाने के लिए फैक्ट्री पैटर्न का उपयोग करना डीआईपी के खिलाफ है, क्योंकि यह उन क्लाइंट की निर्भरता की संख्या को बढ़ाता है, जिनके यहां विवरण है ।
इसलिए, मुझे लगता है कि ASP.NET Core में डिफॉल्ट डि को दो चीजें याद आ रही हैं:
- एक कुंजी का उपयोग करके उदाहरणों को पंजीकृत करने की क्षमता
- पंजीकरण के दौरान निर्माणकर्ताओं में स्थैतिक डेटा को इंजेक्ट करने की क्षमता
Update1
एक अलग प्रश्न में ले जाया जा सकता है क्योंकि निर्माणकर्ताओं में चीजों को इंजेक्ट करना, काम करने से बहुत अलग है जो निर्माण के लिए है