2010-07-05 8 views
7

यह थोड़ा अजीब लग सकता है, लेकिन मुझे वास्तव में जटिल जटिल डुप्लेक्स - संचार - सी # में हैंडलिंग के लिए एक वर्कअराउंड बनाने की ज़रूरत है, विशेष रूप से अन्य डेवलपर्स को DRY - सिद्धांत का पालन करने के लिए मजबूर करना। - अब तकसी #: जेनेरिक पैरामीटर के रूप में "स्वयं" के प्रकार का उपयोग कर?

internal sealed class SessionManager<T> where T : DuplexServiceBase 

जो सभी में कोई समस्या है:

तो क्या मैं कर रहा हूँ एक प्रकार आधारित multiton कि इस तरह दिखता है है।

हालांकि, जैसे ही मैं सेवाएं (मैं प्रति सत्र एक उदाहरण के साथ जा रहा हूँ) खुद को SessionManager के साथ रजिस्टर करना चाहते हैं के रूप में, परेशानी शुरू होता है:

internal abstract class DuplexServiceBase : MessageDispatcherBase<Action> 

(MessageDispatcherBase मेरा एक वर्ग जा रहा है जो एक धागा बनाता है और असीमित रूप से संदेश भेजता है)।

मैं एक विधि है कि इस तरह दिखता है करना चाहते हैं:

protected void ProcessInboundMessage() 
    { 
     // Connect 
     SessionManager<self>.Current.Connect(this); 
    } 

... लेकिन समस्या है - मैं "स्व" के लिए कैसे प्राप्त होगा?

मुझे वास्तव में प्रत्येक सेवा वर्ग के लिए अलग-अलग सत्र प्रबंधक की आवश्यकता होती है, क्योंकि उनके पास अपनी स्वयं की अधिसूचनाएं होती हैं (मूल रूप से यह बहुत ही कष्टप्रद "NotifyAllClients" - विधि है जो हम अपने बालों को पिछले घंटों तक खींचाना चाहते हैं) और आवश्यकता है अलग से इलाज किया जाना चाहिए।

क्या आपके पास कोई विचार है?

मैं "AsyncPattern = true" का उपयोग नहीं करना चाहता, btw ... मुझे मुझे प्रकार की सुरक्षा, लागू अनुबंध अनुपालन छोड़ने की आवश्यकता होगी (इससे संचार प्रणाली का बहुत बुरा दुरुपयोग होगा यहां ऊपर) और DRY - सिद्धांत को त्यागने की आवश्यकता होगी, पूरे स्थान पर बहुत बार दोहराव कोड होगा, और यह कुछ है जो मैं गंभीरता से फहराता हूं।

संपादित करें:

मैं यहाँ उत्तर करने के लिए, सबसे अच्छा संभव समाधान पाया है धन्यवाद - यह एक विस्तार विधि, hehe है ...

public static SessionManager<T> GetSessionManager<T>(this T sessionObject) 
     where T : DuplexServiceBase 
    { 
     return SessionManager<T>.Current; 
    } 

मैं इस तरह इस का उपयोग कर सकते हैं:

GetSessionManager().Connect(this); 

मिशन पूरा हुआ। :- डी

यह विधि (डुप्लेक्स सेवाबेस से संबंधित है) मुझे सत्र प्रबंधक देता है जिसके साथ मैं काम करना चाहता हूं। उत्तम! :-)

उत्तर

15

मैं एक सहायक विधि लिखना चाहते हैं:

static class SessionManager { // non-generic! 
    static void Connect<T>(T item) where T : DuplexServiceBase { 
     SessionManager<T>.Current.Connect(item); 
    } 
} 

और SessionManager.Connect(this) जो इसे सामान्य प्रकार निष्कर्ष के माध्यम से स्वचालित रूप से यह पता लगाने जाएगा का उपयोग करें।

+0

आप एक प्रतिभाशाली हैं, मैं तुम्हें +100, अगर मैं इसका उत्तर देने के लिए कर सकता है देना होगा। बहुत बहुत धन्यवाद !! –

+0

निश्चित रूप से 'सत्र प्रबंधक Current.Connect (आइटम); '? –

+0

हे, मुझे "इस" को "आइटम" के साथ बदलना था, ज़ाहिर है। :-) –

3

आप एक सामान्य विधि में कॉल लपेट सकती है, जिससे संकलक के प्रकार निष्कर्ष का लाभ लेने:

private static void ConnectSessionManager<T>(T service) 
{ 
    SessionManager<T>.Current.Connect(service) 
} 

protected void ProcessInboundMessage() 
{ 
    // Connect 
    ConnectSessionManager(this); 
} 
संबंधित मुद्दे