2008-08-09 15 views
7

मैं अभी भी एएसपी.नेट दुनिया के लिए नया हूं, इसलिए मैं यहां आधार से बाहर निकल सकता हूं, लेकिन अब तक यह मेरे (सीमित) ज्ञान का सर्वोत्तम है !एएसपी.नेट वेब सेवा परिणाम, प्रॉक्सी क्लासेस और टाइप रूपांतरण

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

अब, मैं भी एक उपयोगिता विधि बनाता हूं जो "संपर्क" लेता है और इसके साथ कुछ जादू करता है, जैसे Utils.BuyContactNewHat() कहते हैं। निश्चित रूप से Business.Contact का संपर्क लेता है।

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

Contact c = MyWebService.GetContact("Rob); 
Utils.BuyContactNewHat(c); // << Error Here 

के बाद से GetContact की वापसी प्रकार MyWebService.Contact की अपेक्षा के अनुरूप है और न Business.Contact। मैं समझता हूं कि ऐसा क्यों है, क्योंकि वेब सेवा तक पहुंचने पर, आप वास्तव में डब्लूएसडीएल द्वारा उत्पन्न प्रॉक्सी क्लास के खिलाफ प्रोग्रामिंग कर रहे हैं।

तो, क्या इस प्रकार के मेल के साथ निपटने का एक "आसान" तरीका है? मैं शायद एक जेनेरिक कनवर्टर क्लास बनाने की कोशिश कर रहा था जो प्रतिबिंब का उपयोग करता है ताकि यह सुनिश्चित किया जा सके कि दो वस्तुओं की एक ही संरचना है, केवल मूल्यों को एक से दूसरे में स्थानांतरित करने की तुलना में।

उत्तर

4

आप सही रास्ते पर हैं। प्रॉक्सी ऑब्जेक्ट से डेटा को अपनी खुद की वस्तुओं में से एक में प्राप्त करने के लिए, आपको बाएं हाथ के दाएं हाथ कोड करना होगा। यानी संपत्ति मूल्यों की प्रतिलिपि बनाएँ। मैं आपको शर्त लगाऊंगा कि वहां पहले से ही एक सामान्य विधि है जो प्रतिबिंब का उपयोग करती है।

कुछ लोग वेब सेवा (.net remoting) के अलावा कुछ और उपयोग करेंगे यदि वे केवल तार में एक व्यावसायिक वस्तु प्राप्त करना चाहते हैं। या वे बाइनरी serialization का उपयोग करेंगे। मुझे लगता है कि आप किसी कारण से वेब सेवा का उपयोग कर रहे हैं, इसलिए आपको संपत्ति की प्रतिलिपि करना होगा।

4

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

1

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

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx

:

यहाँ एक (बहुत) इस विषय पर अच्छा ट्यूटोरियल है

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