2012-04-30 19 views
6

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

मैंने सेवा का संदर्भ दिया है लेकिन अब मैं तय नहीं कर सकता कि रैपर कार्यों को सही ढंग से कैसे लिखना है।

क्या इस कार्यक्षमता के लिए कुछ उदाहरण या सर्वोत्तम अभ्यास है।

+0

नीचे चर्चा को जोड़ने (उत्तम व्यवहारों) मैं (एक ही प्रश्नकर्ता द्वारा) निम्नलिखित काफी उपयोगी पाया: http://stackoverflow.com/questions/10575724/moving-wcf-contracts-to-a-separate-dll –

उत्तर

4

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

उदाहरण के तौर पर, मान लीजिए कि हमारे पास भुगतान प्रसंस्करण के लिए बाहरी प्रदाता को डब्ल्यूसीएफ सेवा है। इस तरह कुछ:

void ProcessPayment(float amount); 

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

interface IPaymentProvider 
{ 
    void ProcessPayment(float amount); 
} 

पूरी तरह से WCF सेवा से हमारे कोड दसगुणा होगा। हम आसानी से इस तरह एक वर्ग बना सकते हैं:

class PaymentProviderAWrapper : IPaymentProvider 
{ 
    void ProcessPayment() 
    { 
     // Call the WCF service 
    } 
} 

हम Spring.NET की तरह एक कारखाने या निर्भरता इंजेक्शन ढांचे के साथ गतिशील रूप से लोड कर सकता है। एक प्रदाता बी को बदलने से नई आवरण बनाने के रूप में सरल होगा:

class PaymentProviderBWrapper : IPaymentProvider 
{ 
    void ProcessPayment() 
    { 
     // Call provider B's Native DLL 
    } 
} 

बी करने के लिए प्रदाता एक से अपने कोड स्विचिंग एक विन्यास सेटिंग को बदलने के रूप में सरल हो जाएगा।

भले ही हमने लाइब्रेरी को सीधे हमारे कोड में संकलित किया हो, फिर भी हमें नई पुस्तकालय का उपयोग करने के लिए निर्माण तर्क बदलना होगा। हमारा बाकी का आवेदन बिल्कुल नहीं बदलेगा। बस एक साधारण recompile।

1

ग्रेमैटर के जवाब के जवाब में मुझे नहीं पता कि सेवा रैपर को कॉल करने के बीच क्या अंतर है जो एक ही कॉल का खुलासा करता है और फिर वास्तविक सेवा के लिए कॉल करता है, और केवल सेवा को कॉल करता है, एक-टू- व्यक्तिगत कॉल पर एक मैपिंग और परिवहन बाध्यकारी में कोई बदलाव नहीं।

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

  1. प्रोटोकॉल अनुवाद - सेवा अपनी आवश्यकताओं के लिए बाध्यकारी
  2. सेवा संरचना सही परिवहन भर में संपर्क में नहीं है - इंटरफ़ेस संचालन भी बारीक हैं और व्यापार-स्तर के संचालन का प्रतिनिधित्व नहीं करते हैं।
  3. प्रमाणीकरण - शायद आपको उपभोग करने वाले एंडपॉइंट के शीर्ष पर एक प्रमाणीकरण परत की आवश्यकता होती है।

तो रैप करने के लिए कैसे सेवा समाप्ति बिंदु तुम क्यों सेवा रैप करने के लिए चाहते हैं पर निर्भर करता है ...

+1

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

+0

@ ग्रेमैटर, आप सही ढंग से समझ गए। और आपके द्वारा उल्लिखित कारणों के कारण हैं कि मैं आपकी प्रतिक्रिया के लिए यह डीएल –

+0

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