मेरे पास एक ही इंटरफ़ेस के 2 कार्यान्वयन हैं और यदि उपयोगकर्ता लॉग इन नहीं है तो कार्यान्वयन 1 का उपयोग करना चाहते हैं यदि उपयोगकर्ता लॉग इन नहीं है। मैं इसे महल विंडसर के साथ कैसे कॉन्फ़िगर कर सकता हूं?कैसल वाइंडर सशर्त निर्भरता जोड़ना
उत्तर
इसे हल करने का एक तरीका होगा, कुंजी के साथ सेवा पंजीकृत करें और फिर आपको आवश्यकता के अनुसार हल करें।
public interface ISample
{
int Calculate(int a, int b);
}
class SampleB : ISample
{
public int Calculate(int a, int b)
{
return a + b + 10;
}
}
class SampleA : ISample
{
public int Calculate(int a, int b)
{
return a + b;
}
}
पंजीकरण:
container.Register(Component.For<ISample>().ImplementedBy<SampleA>().Named("SampleA").LifeStyle.Transient);
container.Register(Component.For<ISample>().ImplementedBy<SampleB>().Named("SampleB").LifeStyle.Transient);
// का समाधान करें जब SampleA की जरूरत है।
var sampleA = container.Resolve<ISample>("SampleA");
// नमूनाब की आवश्यकता होने पर हल करें।
var sampleB = container.Resolve<ISample>("SampleB");
आप एक handler selector, जो उदा के आधार पर उपलब्ध कार्यान्वयन के बीच चयन करने के लिए सक्षम हो जाएगा जोड़ सकते हैं चाहे Thread.CurrentPrincipal
सेट किया गया था (या HttpContext.Current.Request.IsAuthenticated
एएसपी.नेट/एमवीसी में अगर मुझे सही याद है)।
हैंडलर चयनकर्ता शायद इस तरह कुछ हद तक दिखेगा:
public class MyAuthHandlerSelector : IHandlerSelector
{
public bool HasOpinionAbout(string key, Type service)
{
return service == typeof(ITheServiceICareAbout);
}
public IHandler SelectHandler(string key, Type service, IHandler[] handlers)
{
return IsAuthenticated
? FindHandlerForAuthenticatedUser(handlers)
: FindGuestHandler(handlers);
}
bool IsAuthenticated
{
get { return Thread.CurrentPrincipal != null; }
}
// ....
}
हैंडलर चयनकर्ताओं के केवल नकारात्मक पक्ष यह है कि वे कंटेनर से निकाला नहीं कर रहे है - यानी वे पंजीकरण पर कंटेनर के लिए एक उदाहरण के रूप में जोड़ दिया जाता है समय, इसलिए उन्हें निर्भरता, जीवनशैली प्रबंधित, इत्यादि नहीं मिलती हैं, लेकिन इसे कम करने के तरीके हैं - F.T.Windsor पर एक नज़र डालें, यदि आप यह देखने में रुचि रखते हैं कि यह कैसे किया जा सकता है।
सोच रहा है कि 3.0 संस्करण के साथ कुछ भी बदल गया है - मेरा मतलब है कि अगर इसे अभी भी बाहरी सुविधा की आवश्यकता है। – Giedrius
- 1. सशर्त मणि निर्भरता
- 2. मैवेन सशर्त निर्भरता
- 3. कैसल विंडसर
- 4. कैसल विंडसर
- 5. कैसल विंडसर
- 6. कैसल विंडसर कॉन्फ़िगरेशन
- 7. कैसल विंडसर
- 8. बाउंसी कैसल
- 9. कैसल विंडसर
- 10. कैसल गतिशील प्रॉक्सी जनरेशन
- 11. लूप और सशर्त कथन के लिए स्कैला मानचित्र में जोड़ना
- 12. सशर्त
- 13. कैसल विंडसर विधानसभाओं
- 14. कैसल डायनैमिक प्रॉक्सी - जीटीआर
- 15. कैसल ActiveRecord सत्रस्कोप
- 16. बाउंसी कैसल सी #
- 17. कैसल विंडसर: संकल्प()
- 18. कैसल विंडसर लॉगिंग सुविधा
- 19. निर्भरता
- 20. कैसल विंडसर: एकाधिक रचनाकारों के साथ समस्या
- 21. सशर्त
- 22. सशर्त
- 23. सशर्त
- 24. कैसल विंडसर 3.0 ComponentRegistration "ServiceType"
- 25. कैसल विंडसर उन्नयन सामान्य प्रकार
- 26. Bouncy कैसल: PEMReader => PEMParser
- 27. कैसल विंडसर - नल कन्स्ट्रक्टर तर्क
- 28. कैसल विंडसर आंतरिक दृश्य सिल्वरलाइट
- 29. बाउंसी कैसल पीजीपी डिक्रिप्शन इश्यू
- 30. कैसल विंडसर आलसी लोड सेवाएं
आप कहां से कंटेनर कॉल करेंगे। रिसेल्व() '? –
कोई रास्ता नहीं है कि विंडसर को पता चलेगा कि उपयोगकर्ता लॉग इन है या नहीं जब तक कि आप इसके आंतरिक कार्यान्वयन को बदल नहीं सकते/बढ़ाते हैं। इसमें एक डिकिडर क्लास हो सकती है जिसमें खाते में 'लॉग इन कारक' लगेगा और वांछित कार्यान्वयन दिया जाएगा। –
विंडसर * * के लिए तंत्र है (मुकिड का जवाब देखें), इसके आंतरिक कार्यान्वयन को बदलने के लिए जरूरी नहीं है। –