2011-04-28 5 views
6

पर विशिष्ट चैनल का चयन करें मान लीजिए कि आपने .NET Remoting में दो TcpChannels पंजीकृत किए हैं।Activator.GetObject

तो मैं एक यूआरएल tcp://...

का उपयोग कर यह संभव है कि किस चैनल में उपयोग करने के लिए चुनने के लिए Activator.GetObject का उपयोग कर प्रॉक्सी प्राप्त करने की कोशिश?

अग्रिम धन्यवाद।

+0

बस एक नोट: डब्लूसीएफ के पक्ष में रिमोटिंग को हटा दिया गया है। – Amy

+0

@ इंयूशाशा: हाँ, लेकिन कुछ अभी भी वंचित हैं। नेट :-( –

उत्तर

5

क्या आपने इसे हल किया?

मुझे पिछले सप्ताह एक ही समस्या थी। (नूनिट का एक मामूली असंगठित साइड-इफेक्ट यह है कि यह यूनिट परीक्षण (मेरी समस्या) चलाने के लिए अपने डीएलएस लोड करते समय डिफ़ॉल्ट "टीसीपी" चैनल को सक्रिय करता है ... फिर मैं कस्टम सिंक के साथ कस्टम सिंक के साथ एक कस्टम टीसीपी क्लाइंट चैनल उदाहरण बना रहा था सर्वर सॉफ्टवेयर ... और हमारे डूब फायरिंग नहीं कर रहे थे जब मैं एक सर्वर वस्तु)

3 समाधान कर रहे हैं instantiated:

  1. आप एक स्थायी रूप से तो अन्य ओवरराइड करने के लिए चाहते हैं, तो बस "प्राथमिकता पारित "आपके TcpClientChannel पर IDictionary कन्स्ट्रक्टर में संपत्ति। यदि सेट नहीं किया गया है तो डिफ़ॉल्ट 1 है, इसलिए यदि आप ओवरराइड करना चाहते हैं तो डिफ़ॉल्ट "टीसीपी" चैनल पंजीकरण कहें तो 1 से अधिक सेट करें। एनबी "नाम" संपत्ति भी सेट की जानी चाहिए, लेकिन स्ट्रिंग हो सकती है। यदि आवश्यक हो तो लक्षण (और तो आप जितना चाहें उतने में से अधिक हो सकते हैं)

  2. पंजीकरण करते समय अपने चैनलों का नाम दें, फिर "उपयोग" निर्माण में कॉल करने के लिए एक अच्छा आईडीस्पोजेबल रैपर लिखें, जो चैनल सर्विसेज को पंजीकृत करता है। पंजीकरण (...) चैनल जिन्हें आप सक्रिय करने के लिए सक्रिय नहीं करना चाहते हैं Activator.GetObject (...)। फिर जब आपका "उपयोग" ब्लॉक समाप्त होता है (यानी कॉल का निपटान()), केवल उन्हीं चैनलों को फिर से लोड करें जिन्हें आपने अनियंत्रित किया है ... सुनिश्चित करें कि आप कुछ सामान्य ऑब्जेक्ट संदर्भ पर "लॉक" का उपयोग करते हैं यदि यह आपके ऐप के भीतर थ्रेड हो गया है ... यह एक बना सकता है टोंटी! (यह मेरा दृष्टिकोण है, क्योंकि मेरा यूनिट परीक्षण पूर्व-लिखित लाइब्रेरी का उपयोग कर रहा था जिसने सर्वर कनेक्शन बनाया: मेरे यूनिट परीक्षण के लिए उत्पादन सॉफ्टवेयर में अस्थिरता का जोखिम बहुत अधिक था)

  3. अस्थायी रूप से गहरे प्रतिबिंब का उपयोग करके अपने लक्षित चैनल की प्राथमिकता को टक्कर दें (यानि निजी फील्ड इन्फोस के साथ झुकाव ... अर्थात् निजी int _channelPriority (मुझे लगता है) ... डबल चेक करने के लिए परावर्तक का उपयोग करें), इससे पहले कि आप Activator.GetObject को कॉल करें। यह थ्रेडिंग मुद्दों के लिए भी खुला है, और फ्रेमवर्क वर्जन-सबूत भी नहीं है (इसलिए मैंने इसे टाला)