WCF

2010-05-03 17 views
10

में ServiceKnownType को समझना मुझे डब्ल्यूसीएफ में ServiceKnownType को समझने में थोड़ा परेशानी हो रही है।WCF

this blog से लिया है, तो निम्न कोड काम नहीं करता:

[DataContract(Namespace = “http://mycompany.com/”)] 
public class Shape{…} 

[DataContract(Namespace = “http://mycompany.com/”)] 
public class Circle : Shape {…} 

[ServiceContract] 
public interface IMyServer 
{ 
    [OperationContract] 
    bool AddShape(Shape shape); 
} 

IMyServer client = new ChannelFactory<IMyServer>(binding, endPoint).CreateChannel(); 

client.AddShape(new Circle()); 

कारण यह काम नहीं करता है क्योंकि आप एक सर्कल जोड़ने की कोशिश कर रहे हैं, लेकिन सेवा नियंत्रण केवल एक आकार की अनुमति देता है। आपको ज्ञातता के साथ कुछ करना है, लेकिन मैं थोड़ा काम करता हूं कि यह कैसे काम करता है।

चूंकि वह कोड सेवा में है, इसलिए यह स्वचालित रूप से क्यों नहीं जानता कि सर्किल आकार से लिया गया है? इसके अतिरिक्त, ServiceKnownType वास्तव में क्या करता है?

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

उत्तर

12

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

इसलिए, आउटगोइंग एक्सएमएल पर टैग "मंडल" उत्पन्न करने में कोई समस्या नहीं होगी, आने वाले deserializater को यह नहीं पता होगा कि इसके साथ क्या किया जाए।

ज्ञात टाइप "हैक" ज्ञात प्रकारों की एक रजिस्ट्री की तरह है जिसे दोनों पक्षों द्वारा कार्यान्वित किया जाना है। यह स्पष्ट है। इस रजिस्ट्री के साथ, deserializer जानता है कि "सर्किल" एक्स टाइप करने के लिए deserializes, बिना किसी अवसर के और बिना व्युत्पन्न प्रकार के लिए सभी उपलब्ध या पहुंच योग्य असेंबली पार्स किए।

याद रखें, स्क्वायर "मैं एक आकार नहीं हूं" कहता हूं, यह एक एक्सएमएल टैग के रूप में आता है और इससे आप आसानी से और स्वचालित रूप से नहीं जानते कि कौन सी .NET कक्षा का उपयोग करना है।

+0

क्या इसे उस सेवा के लिए डेटाकंट्रैक्ट की जांच नहीं करना है? उस उदाहरण में केवल दो ही हैं और शायद उन्हें वैसे भी कैश किया गया है। – NibblyPig

+0

नहीं, क्योंकि डेटा अनुबंध यह नहीं कहता कि कौन से सबक्लास वास्तव में उस संभावित कॉल के लिए मान्य हैं - या जो मौजूद है। डेटा अनुबंध सिर्फ "ठीक है, यह इस संपत्ति में एक आकार है" और नहीं "शेयर के सबक्लास यहां आ रहे हैं"। – TomTom

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