2011-09-21 10 views
7

मेरे पास एक ही इंटरफ़ेस के 2 कार्यान्वयन हैं और यदि उपयोगकर्ता लॉग इन नहीं है तो कार्यान्वयन 1 का उपयोग करना चाहते हैं यदि उपयोगकर्ता लॉग इन नहीं है। मैं इसे महल विंडसर के साथ कैसे कॉन्फ़िगर कर सकता हूं?कैसल वाइंडर सशर्त निर्भरता जोड़ना

उत्तर

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"); 
+1

आप कहां से कंटेनर कॉल करेंगे। रिसेल्व() '? –

+0

कोई रास्ता नहीं है कि विंडसर को पता चलेगा कि उपयोगकर्ता लॉग इन है या नहीं जब तक कि आप इसके आंतरिक कार्यान्वयन को बदल नहीं सकते/बढ़ाते हैं। इसमें एक डिकिडर क्लास हो सकती है जिसमें खाते में 'लॉग इन कारक' लगेगा और वांछित कार्यान्वयन दिया जाएगा। –

+0

विंडसर * * के लिए तंत्र है (मुकिड का जवाब देखें), इसके आंतरिक कार्यान्वयन को बदलने के लिए जरूरी नहीं है। –

7

आप एक 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 पर एक नज़र डालें, यदि आप यह देखने में रुचि रखते हैं कि यह कैसे किया जा सकता है।

+1

सोच रहा है कि 3.0 संस्करण के साथ कुछ भी बदल गया है - मेरा मतलब है कि अगर इसे अभी भी बाहरी सुविधा की आवश्यकता है। – Giedrius

संबंधित मुद्दे