2009-01-22 8 views
6

मेरा आवेदन 2 "सेवाओं" है, मान लें कि एक एक बुनियादी (पूर्णांक) कैलकुलेटर है, और एक एक चल बिन्दु कैलकुलेटर है। मैं तो जैसे इंटरफेस के रूप में इन व्यक्त:डब्ल्यूसीएफ और इंटरफेस विरासत - क्या यह एक भयानक बात है?

public interface IBasicCalculator 
{ 
    int Add(int a, int b); 
} 

public interface IFloatingPointCalculator 
{ 
    double Add(double a, double b); 
} 

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

तो, मैंने इकट्ठा किया है कि मुझे एक "संयुक्त" इंटरफ़ेस पेश करने की आवश्यकता है (कोई इसे भी कॉल कर सकता है एक मुखौटा), इस तरह:

[ServiceContract] 
public interface ICalculatorService : IBasicCalculator, IFloatingPointCalculator 
{ 
    [OperationContract(Name = "AddInt")] 
    new int Add(int a, int b); 

    [OperationContract(Name = "AddDouble")] 
    new double Add(double a, double b); 
} 

मैं यह कर, तो WCF ग्राहक के लिए दोनों तरीकों का है, जो उन्हें कॉल कर सकते हैं को उजागर करता है, और यह सब वास्तव में काम करता है।

हालांकि, उस तरह "इंटरफेस इनहेरिट" कुरूप हो रहा है। विशेष रूप सेnewint Add और newdouble Add। एक विधि पर कड़ाई से बोलते हुए, new एक अंतर्निहित विधि को छिपाने का संकेत देता है, जिसे मैं वास्तव में बिल्कुल नहीं कर रहा हूं। मैं new छोड़ सकते हैं, लेकिन तब मैं सिर्फ संकलक चेतावनी जो राशि के लिए "मुझे लगता है मैं इस विधि छुपा रहा हूँ, आप इसे विधि का नाम बदलें या उस पर 'नए' लगाने की जरूरत है" मिलता है।

तो, यह एक 2-भाग सवाल यह है:

  1. मेरे 'एक इंटरफ़ेस में सब कुछ गठबंधन' तर्क के साथ ट्रैक पर आई एम, या वहाँ वास्तव में बेनकाब करने के लिए "उप सेवाओं" या एक रास्ता है डब्ल्यूसीएफ का उपयोग कर "एकाधिक जुड़ी सेवाएं"?

  2. तो यह है कि क्या किया जाना चाहिए, वहाँ एक बेहतर तरीका है?

धन्यवाद!

उत्तर

4

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

आम तौर पर, मैं इस पथ से नीचे नहीं जाऊंगा, बल्कि, विशिष्ट अनुबंध हैं जो संचालन के तार्किक समूह को दर्शाते हैं जिन्हें आप अंतराल के माध्यम से प्रकट करना चाहते हैं।

8

मैंने अभी काम किया है कि आप एक ही सेवा में कई अंतराल (प्रत्येक इंटरफ़ेस का उपयोग करके) का पर्दाफाश कर सकते हैं, और आपको अभी भी क्लाइंट पर एक प्रॉक्सी lib उत्पन्न करने की आवश्यकता है जो उन सभी तक पहुंच प्रदान करता है, जो मेरी समस्या हल करती है पूरी तरह से।

3

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

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

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

+0

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

+0

मैंने अभी विज़ुअल स्टूडियो "ऐड सर्विस रेफरेंस" टूल का उपयोग किया - यह एक क्लाइंट लाइब्रेरी उत्पन्न करता है - उस लाइब्रेरी में एक प्रॉक्सी क्लास प्रति एंडपॉइंट (इसलिए एक लाइब्रेरी में कई कक्षाएं) थीं, लेकिन सभी वर्ग "प्रॉक्सी" सर्वर पर एकल ऑब्जेक्ट इसलिए इससे कोई फर्क नहीं पड़ता कि वे –

+0

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