WCF / SOA - मुझे साधारण अनुरोधों के लिए पैरामीटर ऑब्जेक्ट क्यों बनाने चाहिए


12

हमारी कंपनी काफी बड़ी SOA पहल शुरू कर रही है। हम बहुत सारा सामान सही कर रहे हैं: अच्छा संचार है; उपकरण के लिए पैसा जहां उपयुक्त हो; और हम संक्रमण के साथ हमारी मदद करने के लिए कुछ अच्छी विशेषज्ञता लाए हैं।

हम मानकों को विकसित करने की कोशिश कर रहे हैं जिन्हें हम एक समूह के रूप में अनुसरण कर सकते हैं, और प्रस्तावित मानकों में से एक मुझे काफी परेशान कर रहा है:

हमने उस पैटर्न पर मानकीकृत किया है जहां प्रत्येक ऑपरेशन एक अनुरोध ऑब्जेक्ट लेता है और एक प्रतिक्रिया ऑब्जेक्ट देता है।

मुझे पता है कि यह बहुत सारे लोगों के लिए एक मानक दृष्टिकोण है, लेकिन मैं पूछ रहा हूं कि मुझे परेशान क्यों होना चाहिए? (मैं प्राप्त ज्ञान के साथ इतना अच्छा नहीं हूं, मुझे कुछ क्यों चाहिए)।

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

डब्ल्यूएसडीएल पर एक नज़र से मेरी बेचैनी बढ़ जाती है जो हमारे अनुबंधों से उत्पन्न होती है। WCF स्वचालित रूप से अनुरोध और प्रतिक्रिया संदेश उत्पन्न करता है और यहां तक ​​कि अनुरोध / प्रतिक्रिया ऑब्जेक्ट लपेटता है।

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

मेरा सवाल यह है कि मुझे अनुरोधों और प्रतिक्रियाओं को स्वचालित रूप से क्यों लपेटना चाहिए:

  • यह सरल सेवाओं को कम अभिव्यंजक बनाता है
  • आप इसे एक जटिल सेवा के लिए वैसे भी करेंगे
  • WCF वैसे भी एक अनुरोध / प्रतिक्रिया संदेश बनाता है

मुझे इस दृष्टिकोण के पक्ष में निम्नलिखित तर्क मिले हैं:

यह अनुरोध ऑब्जेक्ट में वैकल्पिक मापदंडों को फिसलने की अनुमति देकर संस्करण का समर्थन करता है।

दिन में वापस, मैंने COM का एक अच्छा सा काम किया, और मैं इसे संस्करण बनाने के लिए लगभग एक विरोधी पैटर्न मानूंगा। कुछ चीजों के लिए, मुझे लगता है कि यह मदद करेगा, लेकिन मुझे उम्मीद है कि जहां यह मदद करेगा, आपके पास पहले से ही एक पैरामीटर वस्तु है।

यह सामान्य डेटा और व्यवहार को एक आधार वर्ग के लिए पृथक करने की अनुमति देता है

यह कोई मेरे साथ कुछ भार वहन करता है।

यह लोगों को RPC शैली व्यवहार से और संदेश सेवा व्यवहार की ओर ले जाता है

मैंने इसे Microsoft की साइट पर पढ़ा है और इसे हमारे गुरु से सुना है, लेकिन मुझे अभी भी स्पष्ट विचार नहीं है कि उनका क्या मतलब है या यह मूल्यवान क्यों है। क्या यह है कि प्राकृतिक दिखने वाले इंटरफेस लोगों को यह भूल जाते हैं कि वे एक दूरस्थ सेवा कह रहे हैं?

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

जवाबों:


3

मुझे लगता है कि संस्करण बनाना शायद सबसे अच्छा तर्क है। जब आपके पास मौजूदा संचालन अनुबंध होता है जैसे

int GetPersons(int countryId);

आप बाद में किसी अन्य फ़िल्टर द्वारा, जैसे कि एन्हांस करना चाहते हैं

int GetPersons(int countryId, int age);

आपको एक नया ऑपरेशन अनुबंध लिखना होगा और एक नए नाम के साथ क्योंकि यह अद्वितीय होना है। या आप नाम रखेंगे और अपनी सेवा के नए v2 को पुराने v1 के साथ अभी भी पीछे की ओर संगतता के लिए प्रकाशित करेंगे।

यदि आप पैरामीटर को एक ऑब्जेक्ट में लपेटते हैं, तो आप इसे हमेशा डिफ़ॉल्ट / वैकल्पिक मापदंडों के साथ बढ़ा सकते हैं और जब आप एक ही ऑपरेशन अनुबंध का पुन: उपयोग करते हैं तो आपके सभी मौजूदा क्लाइंट अप्रभावित रहेंगे।

हालाँकि मैं आपकी वस्तुओं का नाम उचित रूप से रखने का आग्रह करूंगा। यहां तक ​​कि अगर यह सिर्फ एक इंट लपेटता है, अगर आप इसके साथ IntMessageया कुछ इसी तरह शुरू करते हैं, तो आप अपने आप को इसे बढ़ाने के पक्ष में नहीं कर रहे हैं। आपको इसे PersonFilterशुरू से ही नाम देना होगा , जिसका अर्थ है कि आपको इस बारे में थोड़ा सोचना होगा कि इस सेवा कॉल को शब्दार्थ के रूप में क्या उम्मीद करनी चाहिए और इसलिए इसे क्या करना चाहिए। हो सकता है कि (और यह एक बहुत अस्पष्ट हो सकता है) कि सही सेवाओं को विकसित करने और एक सभ्य आकार एपीआई बनाए रखने में मदद करने जा रहा है।

यह सामान्य डेटा और व्यवहार को एक आधार वर्ग के लिए पृथक करने की अनुमति देता है

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

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

कुल मिलाकर, संस्करण के अलावा, मैं वास्तव में इसे इस तरह से करने के लिए हत्यारा कारण नहीं पा सकता हूं।


मुझे लगता है कि यही कारण है कि मैं
एंडी डेविस

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

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

0

मुझे लगता है कि डेटा ट्रांसफर ऑब्जेक्ट पर मार्टिन फाउलर के नोट्स उपयुक्त हैं।

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

समाधान एक डेटा ट्रांसफर ऑब्जेक्ट बनाना है जो कॉल के लिए सभी डेटा को पकड़ सकता है। यह कनेक्शन के पार जाने के लिए क्रमबद्ध होने की आवश्यकता है। आमतौर पर डीटीओ और किसी भी डोमेन ऑब्जेक्ट के बीच डेटा ट्रांसफर करने के लिए सर्वर साइड पर असेंबलर का इस्तेमाल किया जाता है।

वही अनुरोधों पर लागू हो सकता है। RPC के लिए, और इसका बुरा क्यों है:

क्या यह है कि प्राकृतिक दिखने वाले इंटरफेस लोगों को यह भूल जाते हैं कि वे एक दूरस्थ सेवा कह रहे हैं?

मुझे लगता है कि यह सच है, लेकिन मुख्य कारण नहीं है। आरपीसी से बचने का एक अन्य कारण यह है कि यह ग्राहकों और सेवाओं को मजबूती से प्रोत्साहित कर सकता है।


इनपुट के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि डीटीओ चर्चा सभी प्रासंगिक है। यह कॉल की एक ही संख्या है, और यदि आप WSDL को देखते हैं, तो सब कुछ स्वचालित रूप से एक अनुरोध और पुनरावृत्ति वस्तु में पैक किया जाता है। सम्मेलन दृश्यमान शब्दार्थ के बारे में है , अर्थात, लोगों को इसे दूरस्थ विधि कॉल के विपरीत अनुरोध और प्रतिक्रिया के रूप में सोचना चाहिए।
एंडी डेविस

क्या आप आरपीसी को विस्तृत रूप से युग्मित ग्राहक और सेवाओं को प्रोत्साहित करने की परवाह करेंगे? मैं यह नहीं देख सकता कि यह सेवा को बिल्कुल प्रभावित करता है। क्लाइंट के लिए, मैं वास्तव में यह नहीं देखता कि वास्तव में कुछ भी कैसे बदलता है। या तो मामले में, मेरे पास एक प्रॉक्सी रखने वाला क्लाइंट है जो एक सेवा द्वारा प्रदान किए गए कई ऑपरेशनों का वर्णन करता है। जो वास्तव में सेवा के दूसरे पक्ष को लागू करता है वह किसी भी मामले में ग्राहक का व्यवसाय नहीं है।
एंडी डेविस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.