2012-04-03 15 views
7

मैं निम्नलिखित इंटरफ़ेसमानचित्रण -> IHandler <T>

public interface IHandler<T> 
{ 
    void Handle(T myObject); 
} 

मैं उनकी संगत हैंडलर के लिए वस्तु प्रकार के बीच एक मानचित्रण धारण के साथ एक HandlersManager वर्ग करना चाहते हैं, लेकिन मुझे यकीन है कि नहीं कर रहा हूँ मैं इस मैपिंग को पकड़ने वाली ऑब्जेक्ट को कैसे परिभाषित करना चाहता हूं।

उदाहरण के लिए, मैं क्या करना चाहते हैं यह है:

typeof(string) --> instance of IHandler<string> 
typeof(MyClass) --> instance of IHandler<MyClass> 

सबसे अच्छी बात मुझे बहुत मिल गया अब तक मानचित्रण के लिए Dictionary<Type, object> परिभाषित करने के लिए, लेकिन इस मामले में मैं मूल्य कास्ट करने के लिए होता था हर बार जब मैं इसे प्राप्त करता हूं IHandler<T> पर।

क्या कोई बेहतर समाधान या कुछ है जिसे मैंने पूरी तरह याद किया है?

+1

तो 'IHandler ' विरासत में मिला 'IHandler' तो आप की' <प्रकार, IHandler> '' बहुत IEnumerable' – Jodrell

+2

@Jodrell के साथ होता है के रूप में IHandler' एक खाली इंटरफेस होगा के रूप में ', यह वही है एक शब्दकोश हो सकता था 'ऑब्जेक्ट' का उपयोग करते हुए, चूंकि कास्ट अभी भी आवश्यक है। –

उत्तर

5

यह उतना ही अच्छा है जितना कि यह केवल एक सामान्य IHandler<T> इंटरफ़ेस के साथ प्राप्त हो सकता है।

अधिक विकल्प का पता लगाने के लिए, हम इंटरफ़ेस का एक गैर जेनेरिक वर्जन निर्धारित कर सकते हैं:

:

public interface IHandler 
{ 
    void Handler(object myObject); 
} 

तो फिर तुम भी एक सामान्य सार आधार वर्ग है कि दोनों IHandler<T> और IHandler लागू करता है निर्धारित कर सकते हैं

public abstract class BaseHandler<T> : IHandler, IHandler<T> 
{ 
    public abstract void Handle(T myObject); 

    void IHandler.Handle(object myObject) 
    { 
     ((IHandler<T>)this).Handle((T) myObject); 
    } 
} 

इस बिंदु पर आप एक IDictionary<Type, IHandler> हो सकता है और आप सीधे मूल्यों आप इसे से बाहर निकलने पर IHandler.Handle कॉल कर सकते हैं:

var obj = /* whatever */ 
dictionary[obj.GetType()].Handle(obj); 

दूसरी ओर अब हमारे पास "उपयोगकर्ता" कोड से एक कलाकार छिपाने के लिए एक अतिरिक्त इंटरफ़ेस और एक सार आधार वर्ग है, जो बहुत प्रभावशाली नहीं लगता है।

10

मुझे संदेह है कि आप निर्भरताओं को हल करने के लिए इसका उपयोग कर रहे हैं। इसके बजाय, एक समर्पित कंटेनर का उपयोग करें जो आपके लिए इन मुद्दों को संभालेगा।

Dictionary<Type, object> dictionary; 

IHandler<T> Resolve<T>() { 
    return (IHandler<T>)dictionary[typeof(T)]; 
} 

वहाँ जेनरिक के साथ किसी अन्य तरीके से नहीं है:

आप ऐसा नहीं करना चाहते हैं, तो आप कुछ इस तरह करना चाहते हैं।

क्या कोई बेहतर समाधान या कुछ है जिसे मैंने पूरी तरह याद किया है?

नहीं, लेकिन प्रबंधक वर्ग आमतौर पर कोड गंध होते हैं। सावधान रहे।

+0

यह गैर-विशिष्ट प्रबंधक वर्ग की तुलना में फैक्ट्री क्लास की तरह लगता है, इसलिए मुझे नहीं लगता कि यहां एक गंध है। – Rup

+1

@Rup: वाकई, हम में से कोई भी संदर्भ को देखे बिना उपयोग को जानता है। उन्होंने इसे एक प्रबंधक कहा, और यह एक संकल्प की तरह दिखता है। यह एक गंध है क्योंकि अगर मेरे पास इस प्रबंधक का उपयोग कर एक वर्ग है, तो मुझे कंक्रीट 'IHandler पता नहीं चल रहा है, और इसलिए मुझे नहीं पता कि IHandler यह किस पर निर्भर है। – jason

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