2010-05-13 19 views
6

जब आप ASP.Net ढांचे में वेब सेवा प्रॉक्सी क्लास बनाते हैं और उपयोग करते हैं, तो क्लास अंततः घटक से प्राप्त होता है, जो IDISposable लागू करता है।एक वेब सेवा प्रॉक्सी कक्षा का निपटान?

मैंने कभी एक उदाहरण ऑनलाइन नहीं देखा है जहां लोग वेब प्रॉक्सी कक्षा का निपटान करते हैं, लेकिन यह सोच रहा था कि इसे वास्तव में करने की आवश्यकता है या नहीं। जब मैं केवल एक विधि को कॉल करता हूं, तो मैं इसे सामान्य रूप से उपयोग करने वाले कथन में लपेटता हूं, लेकिन अगर मुझे इसे पूरे पृष्ठ पर कई बार कॉल करने की ज़रूरत है, तो मैं एक ही उदाहरण का उपयोग कर समाप्त कर सकता हूं, और सिर्फ यह सोचकर कि क्या विधियां निपटान नहीं कर रही हैं यह।

उत्तर

8

आपको सब कुछ का निपटान करने की आवश्यकता है जो IDisposable लागू करता है।

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

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

3

कभी-कभी निपटान() केवल एक डमी है (बेस क्लास से विरासत में मिला है), लेकिन फिर भी यह भविष्य में बदलावों के लिए सुरक्षित होने के लिए इसे कॉल करने का एक अच्छा अभ्यास है।

एक वेब सेवा/डब्ल्यूसीएफ प्रॉक्सी कनेक्शन धारण कर रहा है, इसलिए निश्चित रूप से निपटान() या बंद() को कॉल करना एक अच्छा विचार है। एक प्रयोग ब्लॉक के अंदर ऐसा करना निश्चित रूप से बेहतर है क्योंकि यह अपवाद सुरक्षित है।

लेकिन आपके मामले में (आपके पृष्ठ पर एकाधिक विधियों में प्रॉक्सी का उपयोग करके) ब्लॉक का उपयोग करके एकाधिक का उपयोग संभवतः एक प्रदर्शन हिट लेगा। पृष्ठ चक्र में देर से आने वाली किसी ईवेंट में कॉल बंद करें() के साथ उपयोग करने वाले ब्लॉक को प्रतिस्थापित करना ठीक है। मुझे यहां एएसपी.NET सर्वोत्तम प्रथाओं के बारे में निश्चित नहीं है, लेकिन मैं OnPreRender या OnPageUnload या कुछ का उपयोग करूंगा।

आप यहां अपवाद सुरक्षा खो देंगे लेकिन यह एक मौलिक समस्या नहीं है, जीसी इसे हल करेगा।

1

आईएमएचओ, वेब-सेवा प्रॉक्सी क्लास का निपटान करने की तरह कुछ भी नहीं है।

प्रॉक्सी के अधिकांश हैं:

  • स्टेटलेस, इस तरह के फोन करने के एक उदाहरण का उपयोग कर या एक से अधिक इंस्टेंस का उपयोग कर कोई फर्क
  • आंतरायिक अर्थ है कि वे कनेक्शन के रूप में जल्द ही बंद नहीं है के रूप में के रूप में सभी प्रतिक्रिया संसाधित किया जाता है
6

संक्षिप्त उत्तर यह है कि वेब सेवा प्रॉक्सी क्लासेस के साथ, आपको उन्हें बंद करना चाहिए और उन्हें निपटाना नहीं चाहिए।

लगभग हर मामले में आपको उन चीज़ों का निपटान करना चाहिए जो IDISposable लागू करते हैं। हालांकि, वेब सेवा प्रॉक्सी कक्षाएं एक विशेष मामला हैं।इन कक्षाओं और System.ServiceModel.ClientBase से प्राप्त होने वाली सभी कक्षाओं के साथ, कॉल निपटान के लिए यह सर्वोत्तम अभ्यास है लेकिन बंद विधि को सीधे कॉल करने के लिए।

परावर्तक का उपयोग करके, आप देख सकते हैं कि DisposeClientBase की विधि बस Close पर कॉल करती है। तो यदि कोई अपवाद नहीं है, Dispose और Close वही काम करेंगे। हालांकि अगर कोई अपवाद है, तो अलग-अलग व्यवहार होंगे।

क्योंकि Close विधि अपवाद फेंक सकती है, आपको इसे सीधे कॉल करना चाहिए और इसे अपवाद पकड़ना चाहिए। यदि आप Dispose विधि को कॉल करते हैं, तो आपको अपवाद भी पकड़ना चाहिए, लेकिन आपका कोड समझना मुश्किल होगा।

इसका यह भी अर्थ है कि आपको using कथन में प्रॉक्सी की घोषणा डालने से बचना चाहिए। इस मामले में, यदि using ब्लॉक में कोई अपवाद फेंक दिया गया है, तो यह अस्पष्ट हो जाएगा। Dispose कॉल जो using ब्लॉक द्वारा स्वतः उत्पन्न होता है उसे कॉल किया जाएगा क्योंकि यह finally ब्लॉक में है। Dispose में Close से फेंक दिया गया अपवाद पहले से फेंक दिया गया अपवाद अस्पष्ट करेगा।

अधिक विस्तृत explinations देखने के लिए, पर MSDN, Coding Up Style, BlogginAbout.Net, और StackOverflow ये लेख पढ़ें।

बैकस्ट्रीरी के लिए इसे इस तरह कार्यान्वित क्यों किया जाता है, इस धागे को MSDN forums पर देखें।

+1

ध्यान दें कि वे लिंक डब्लूसीएफ सेवा संदर्भों के लिए विशिष्ट हैं, न कि .NET 2.0 वेब संदर्भ। इससे कोई फर्क पड़ता है कि आप अपनी प्रॉक्सी कैसे बनाते हैं। – TrueWill

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