2012-08-16 16 views
7

मैं डब्ल्यूसीएफ के कुछ आंतरिक कार्यों की बेहतर समझ प्राप्त करने की कोशिश कर रहा हूं। मैंने चारों ओर देखने की उचित मात्रा में काम किया है, लेकिन IClientChannel.Open() की तुलना में ChannelFactory.Open() की स्पष्ट व्याख्या नहीं मिली है। कारखाने को खोलने का उद्देश्य क्या है? यदि चैनल संचार के लिए उपयोग किया जा रहा है, चैनल के निर्माण और खोले जाने के बाद कारखाने में प्रक्रिया में कौन सा हिस्सा चलता है?ChannelFactory.Open VS IClientChannel.Open

प्रश्न अन्य प्रश्नों के साथ here पूछा गया था, लेकिन सीधे जवाब नहीं दिया गया।

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

बाद de-संकलन स्रोत कोड, मैं क्यों खुला जरूरतों ChannelFactory, जो नीचे दर्ज है पर कहा जा विशिष्ट कारणों में से कुछ मिल गया।

मुझे अभी भी समझ में परेशानी हो रही है कि यह काम ICOMunicationObject द्वारा प्रदान की गई तंत्र के माध्यम से क्यों किया जा रहा है, जब कारखाना वास्तव में कुछ भी (जहां तक ​​मुझे पता है) से संचार नहीं कर रहा है। जब वस्तु का निर्माण या निपटान किया जाता है तो इन चीजों को न केवल संभालें?

मुझे लगता है कि मैं शायद खरपतवारों में काफी दूर हूं कि ऐसा उत्तर सार्वजनिक रूप से उपलब्ध नहीं हो सकता है। उन लोगों के लिए धन्यवाद जिन्होंने मूल प्रश्न पर वजन कम किया था।

उत्तर

1

System.ServiceModel में संबंधित कक्षाओं का एक समूह संकलित करने के बाद, मैं थोड़ी अधिक जानकारी प्राप्त करने में सक्षम था।

Open कॉल संचार ऑब्जेक्ट को विरासत वृक्ष के नीचे अपना रास्ता बनाने के लिए प्रतीत होता है, जहां इसकी Open विधि कहा जाता है। ऐसा लगता है कि यह नैदानिक ​​जानकारी का एक गुच्छा प्रदान करता है और कई घटनाओं को बढ़ाता है।

protected override void OnOpening() 
{ 
    base.OnOpening(); 
    this.innerFactory = this.CreateFactory(); 
    if (this.innerFactory == null) 
    { 
     throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString("InnerChannelFactoryWasNotSet"))); 
    } 
} 

के रूप में दूसरों को यहाँ से उल्लेख किया गया है, बंद घटनाओं को भी करीब जैसी चीज़ों के लिए उपयोग किया जाता है:

ChannelFactory वर्ग ओपन घटनाओं इसकी भीतरी चैनल कारखाना बनाने सहित चीजों के एक नंबर, कर का उपयोग करता है सभी अंतर्निहित चैनल, (इसके आंतरिक चैनल फैक्ट्री के माध्यम से):

protected override void OnClose(TimeSpan timeout) 
{ 
    TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); 
    while (true) 
    { 
     IChannel channel; 
     lock (base.ThisLock) 
     { 
      if (this.channelsList.Count == 0) 
      { 
       break; 
      } 
      channel = this.channelsList[0]; 
     } 
     channel.Close(timeoutHelper.RemainingTime()); 
    } 
} 
0

ओपनिंग चैनलफैक्टरी या आंतरिकचैनल बस ऑब्जेक्ट की स्थिति को बदलता है, जब बनाया गया राज्य में तत्काल प्रारंभ होता है, ऑब्जेक्ट कॉन्फ़िगर किया जा सकता है लेकिन यह खुले राज्य में, संचार ऑब्जेक्ट में संदेश भेजने या प्राप्त करने के लिए उपयोग योग्य नहीं है उपयोग करने योग्य है लेकिन यह अब कॉन्फ़िगर करने योग्य नहीं है

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

चैनल कारखाने चैनल बनाने के लिए जिम्मेदार हैं। चैनल कारखानों द्वारा बनाए गए चैनल संदेशों को भेजने के लिए उपयोग किए जाते हैं। ये चैनल उपर्युक्त परत से संदेश प्राप्त करने के लिए ज़िम्मेदार हैं, जो भी प्रसंस्करण आवश्यक है, फिर नीचे दी गई परत पर संदेश भेजना। निम्नलिखित ग्राफिक इस प्रक्रिया

http://msdn.microsoft.com/en-us/library/ms789050.aspx

आशा दिखाता है यह मदद करता है

+0

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

+0

क्षमा करें, लेकिन मुझे नहीं पता कि माइक्रोसॉफ्ट ने यह विकल्प क्यों किया क्योंकि मैं नहीं (और मुझे लगता है कि मैं नहीं कर सकता) जानता हूं कि चैनलफैक्टरी कैसे कार्यान्वित किया जाता है और न ही यह चैनल बनाता है, मुझे आशा है कि अगर कोई इसके बारे में और जान जाए तो हमें पता है :) – MaRuf

6

ओपन कारखाने में कॉल किया जाना चाहिए, क्योंकि यह एक ICommunicationObject है - इससे पहले कि आप उन में से एक का उपयोग करें, इसे खोला करने की आवश्यकता है । लेकिन ज्यादातर मामलों में कारखाना स्वचालित रूप से आपके लिए खोला जाता है जब आप CreateChannel जैसी चीज़ों को कॉल करते हैं, उदाहरण के लिए, इसलिए आपको शायद ही कभी कारखाने को खोलने के बारे में चिंता करने की आवश्यकता हो।

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

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, साइबरमैक्स। मैं मल्टीप्लेक्सिंग से परिचित नहीं हूं, और Google पर खोज करने के बाद बहुत मदद नहीं मिली। क्या आप मुझे इस बात की ओर इशारा कर सकते हैं कि मुझे इस पर जानकारी मिल सकती है, और चैनल फैक्ट्री उन मामलों में अंतर्निहित कनेक्शन कैसे प्रबंधित करती है? साथ ही, मैंने अतिरिक्त प्रश्न के साथ अपना प्रश्न अपडेट किया है और यदि आपके पास कोई और विचार है तो एक और विशिष्ट प्रश्न। –