2009-05-08 11 views
9

के रूप में होस्ट किए जाने पर डब्ल्यूसीएफ 'ठीक से' अमूर्त प्रकारों का उपभोग/खुलासा नहीं करता है, मैं हाल ही में वेब सेवाओं को डिजाइन कर रहा हूं लेकिन हाल ही में कभी भी 'जटिल' डब्ल्यूसीएफ सेवा का खुलासा नहीं करना पड़ा। मैं अमूर्त प्रकारों के लिए डब्ल्यूसीएफ में "उचित समर्थन" की स्पष्ट कमी पर परेशान था। सुनिश्चित करें कि - आप उनका उपयोग कर सकते हैं - सुनिश्चित करें कि आप उन्हें 'काम' के लिए प्राप्त कर सकते हैं ... तुम सिर्फ तुम क्या चाहते अंत नहीं है ...क्यों वेब सेवा

पहली समस्या यह है कि अगर आप के साथ एक wsdl से कोड उत्पन्न एक अमूर्त प्रकार आपको बहुत अलग कोड मिलता है क्योंकि यह xmlserializer पर वापस आता है, न कि DataContractSerializer। यह स्पष्ट रूप से वांछनीय से थोड़ा सा है ... मैं फैंसी नए तेज़ धारावाहिक का उपयोग करना चाहता हूं, कृपया धन्यवाद ... (और सेवा/डेटाकंट्रैक्ट के साथ आने वाले सभी)

फ्लिप पक्ष पर - यदि आप पहले कोड से शुरू करें और एक वेब सेवा के रूप में एक उचित रूप से जिम्मेदार अमूर्त डब्ल्यूसीएफ कक्षा का पर्दाफाश करें, wsdl में "अमूर्त वर्ग" तकनीकी रूप से ठोस बनाने के लिए सार = "सत्य" विशेषता नहीं है ... यह वही नहीं है जो मैं चाहता हूं ..

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

यह सब सिर्फ बेकार है! मुझे आशा है कि कोई मुझे स्पष्ट रूप से समझा सकता है कि 'क्यों' है ... मैं उन उत्तरों का स्वागत करता हूं जो "ठोस" संसाधनों का हवाला देते हैं लेकिन मैं वास्तव में व्यक्ति को बताने के लिए इंतजार कर रहा हूं - उचित दस्तावेज के साथ (जैसे अधिमानतः अच्छा ओएल डॉन बॉक्स खुद) क्यों यह वास्तव में है ... क्योंकि मुझे बस यह नहीं मिला ...

धन्यवाद सब - अगर कोई और विवरण चाहें - कृपया मुझे बताएं!

एक नमूना अनुरोध के अलावा के लिए अपडेट किया - सी # के साथ शुरू

[ServiceContract] 
public interface IShapeTest 
{ 
    [OperationContract] 
    AbsShape EchoShape(AbsShape shape); 
} 

public class ShapeTestImpl : IShapeTest 
{ 
    public AbsShape EchoShape(AbsShape shape) 
    { 
    return shape; 
    } 
} 

[KnownType(typeof(Square))] 
public abstract class AbsShape 
{ 
    [DataMember] 
    public int numSides; 
} 

public class Square : AbsShape 
{ 
    public Square() : base() 
    { 
    numSides = 4;//set the numSides to 'prove' it works 
    } 
} 

अपेक्षित प्रकार:

<xs:complexType name="AbsShape" abstract="true"> <!--NOTE abstract="true"--> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="numSides" type="xs:int"/> 
    </xs:sequence> 
</xs:complexType> 

वास्तविक उत्सर्जित प्रकार:

<xs:complexType name="AbsShape"> <!--NOTE the lack of abstract="true"--> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="numSides" type="xs:int"/> 
    </xs:sequence> 
</xs:complexType> 
+0

शायद आप एक उदाहरण प्रदान करेंगे? मुझे लगता है कि आपके पास 'परेशानी' नहीं है। –

+0

नमूना पोस्ट किया गया (15 वर्णों को पूरा करने के लिए अधिक वर्ण - lol) – dovholuk

उत्तर

5

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

+1

आपकी प्रतिक्रिया के लिए धन्यवाद और मैंने इंटरनेट पर इस प्रकार का उत्तर देखा है, लेकिन मुझे विश्वास नहीं है कि यह "सही" है। मैं यह इसलिए कहता हूं क्योंकि यह संदेश भेज रहा है, फिर भी वे संदेश polymorphic हो सकते हैं। यदि बहुरूपता एक मुद्दा था तो मैं उम्मीद करता हूं कि DataContractSerializer किसी भी अन्य वस्तु से अच्छी तरह से प्राप्त वस्तु को स्वीकार नहीं करेगा (अच्छी तरह से ऑब्जेक्टिंग ऑब्जेक्ट)। वास्तव में अजीब चीज यह है कि यदि आप अपने ओडब्ल्यूएन wsdl को क्राफ्ट करते हैं जिसका उपयोग 'abstract = true' है - डब्ल्यूसीएफ में कोई समस्या नहीं है और यह ठीक काम करता है ... समस्या यह है कि उत्सर्जित प्रकार असंगत है ... imho – dovholuk

+0

संदेश वास्तव में polymorphic नहीं हैं (जब तक कि आपकी विधि स्वीकार नहीं करता है और एक प्रकार का संदेश देता है, संदेश) निश्चित रूप से एक ऑब्जेक्ट जिसमें संदेश अनुबंध लागू होता है, यह पॉलिमॉर्फिक हो सकता है लेकिन यह सेवा की सीमा पर जीवन समाप्त होता है। तो हां, आप एक जटिल प्रकार के लिए सार = सत्य विशेषता प्राप्त कर सकते हैं, लेकिन फिर क्लाइंट को कैसे पता चलता है कि किस ठोस प्रकार का उपयोग किया जाना चाहिए, जब तक कि आप कार्यान्वयन पुस्तकालयों को साझा नहीं कर रहे हों, तो SOA को हमें अलग करना चाहिए । – blowdart

+0

ग्राहक जानता है कि xsi द्वारा किस प्रकार का उपयोग किया जाना चाहिए: xml में जो प्रकार दिया गया है ... वैसे ही XmlSerializer इसे करता है ... मेरे लिए इसका एकमात्र पागल हिस्सा यह है कि XmlSerializer इसे ठीक से संभाल लेगा, DataContractSerializer भी एक्सएमएल को ठीक से deserialize करेगा, लेकिन DataContractSerializer बस शुरू करने के लिए सार के रूप में प्रकार का खुलासा नहीं करेगा ... मुझे यह अजीब लगता है ... – dovholuk

2

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

मैं तुम्हें सार का उपयोग कर रहे हैं, क्योंकि कि OO जिस तरह से चीजें करना है संदेह है लेकिन तुम OO नहीं कर रहे हैं, तो आप वेब सेवाओं कर रहे हैं -।।। एसओए वहाँ एक अंतर है

+0

आपकी टिप्पणी के लिए धन्यवाद ... मेरा प्रश्न - जैसा कि मैंने नीचे टिप्पणी की है - वैसे ही डब्ल्यूसीएफ किसी भी तरह के बहुरूप व्यवहार का समर्थन क्यों करेगा? साइड सवाल - डब्लूसीएफ डेटाकंट्रैक्टसेरियलाइज़र के साथ कोई 'पसंद' कैसे करता है ... ऐसा लगता है कि 'उत्तर' है "आप नहीं कर सकते" ... और मुझे लगता है कि यह 'गलत' है - नहीं? – dovholuk

+3

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

+0

मुझे दोबारा प्रयास करने दो। मैं सुनता हूं कि आप कहां से आ रहे हैं इसलिए मुझे इस तरह के प्रश्न पूछने दो ... "मैं एक डेटा अनुबंध कैसे निर्दिष्ट कर सकता हूं जो मुझे एक ऐप्पल डेटा संरचना या ऑरेंज डेटा संरचना भेजने की अनुमति देता है"? मैंने स्पष्ट रूप से एक्सएस का संदर्भ नहीं दिया: पसंद क्योंकि मैं भ्रम जोड़ना नहीं चाहता था लेकिन अब ऐसा करने का समय है ... स्कीमा का उपयोग करके मैं इसे 3 में से 1 तरीकों से कर सकता हूं। ए।) "Xsd polymorphism" (क्लीनर ओओ कोड - आईएमओ को बनाए रखने में आसान) बी।) Xs: पसंद (स्पष्ट xml - आम तौर पर यूजीएल ओओ कोड - बनाए रखने के लिए xsd कठिन) सी।) प्रतिस्थापन समूह ("पर्याप्त बंद करें" पसंद के समान होना) तो मैं डब्ल्यूसीएफ के साथ ऐसा कैसे करूं? – dovholuk

1

इस प्रश्न का आधार यह है कि डब्ल्यूसीएफ को एक एक्सएसडी कॉम्प्लेक्स टाइप टाइप को एक सार तत्व के साथ एक सी # अमूर्त वर्ग के रूप में सत्य के रूप में चिह्नित करना चाहिए।यदि आप WSDL spec on future extensibility, देखते हैं तो आप इस उदाहरण को देखेंगे कि कैसे स्पेस इस तत्व को एक्सएसडी सुविधा का उपयोग करता है ताकि "तत्व आइटम" को जोड़ने के बिना WSDL spec को संशोधित करने की आवश्यकता हो।

एक्सएसडी सार विशेषता का उद्देश्य अन्य एक्सएसडी "प्रकारों" को आधार प्रकार से परिभाषाओं का वारिस करने की अनुमति देना है। ऐसा लगता है कि @dovholuk क्या करने के लिए डब्ल्यूसीएफ की तलाश में है, लेकिन वास्तव में यह एक्सएसडी प्रकार परिभाषा के लिए एक उपकरण है। इस एक्सएसडी फीचर में सी # कक्षा संरचनाओं में एक्सएमएल के क्रमिकरण पर कोई असर नहीं पड़ता है क्योंकि इसका उपयोग एक्सएसडी परिभाषाओं के भीतर किया जाना है। तो @blowdart & @ जोहान सैंडर्स दोनों का संक्षेप में, डब्ल्यूसीएफ संदेश विनिमय पर एक अमूर्त है, जिसकी एक्सएसडी-आधारित प्रकार परिभाषा एक कार्यान्वयन विस्तार है।

+0

मुझे लगता है कि आप पूरी तरह से बिंदु चूक गए हैं। आपके द्वारा उद्धृत किया गया नमूना असंबंधित है (मेरे परिप्रेक्ष्य से)। Http://www.w3.org/TR/xmlschema-0/#abstract देखें। "जब कोई तत्व या प्रकार" सार "घोषित किया जाता है, तो इसका उपयोग किसी दस्तावेज़ दस्तावेज़ में नहीं किया जा सकता है।" यह ओओपी में एक ही अवधारणा के लिए पूरी तरह से नक्शे है। सी # एक ओओ भाषा है और इस तरह मुझे समझ में नहीं आता क्यों डब्ल्यूसीएफ ऐसा नहीं करेगा जो मेरे लिए पूरी तरह से प्राकृतिक लगता है। आपकी टिप्पणी/उत्तर के लिए धन्यवाद – dovholuk

+0

मेरा मानना ​​है कि आपके प्रश्न का सही जवाब डरावना है ** यह डिज़ाइन द्वारा है। ** डब्लूएसडीएल डेटा अनुबंध विवरण के लिए एक्सएसडी का उपयोग करता है, इसका मतलब यह नहीं है कि एक्सएसडी संरचनाओं को लागू करने के लिए एक ढांचा आवश्यक है अनुपालन करने के लिए विरासत टाइप करें। मुझे लगता है कि जिस बिंदु पर आप विचार करने में असफल रहे हैं वह यह है कि डब्ल्यूसीएफ एक मैसेजिंग अबास्ट्रक्शन है। यह एक्सएसडी स्पेक की .NET भाषा में कार्यान्वयन के लिए नहीं बनाया गया था। वास्तव में, साबुन/डब्ल्यूएसडीएल डब्ल्यूसीएफ द्वारा समर्थित कई संदेश प्रोटोकॉल पर है। कृपया इस मृत घोड़े को पीटा :) –

+0

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

0

उपयोग [XmlSerializerFormat] सार प्रकार पर गुण

1

विशेषता "सार = सच" एक प्रकार की विरासत के साथ ही डबल्यूएसडीएल जब आप जावा ईई का उपयोग में संरक्षित है। ऑब्जेक्ट मॉडल में "अमूर्त" या "विस्तार" जैसे पारंपरिक जावा कीवर्ड का कोई भी उपयोग डब्लूएसडीएल और एक्सएसडी में संरक्षित है। कोई विशेष विशेषता या मैंगलिंग आवश्यक नहीं है।

डब्ल्यूसीएफ सेवाएं डब्लूएसडीएल में अमूर्त विशेषता उत्पन्न करने में असफल रही। डब्लूसीएफ भी ऑब्जेक्ट मॉडल विरासत को पार करने में विफल रहता है, जिसके लिए डब्ल्यूएसडीएल में उचित एक्सएसडी विरासत के परिणामस्वरूप ज्ञात टाइप टाइप की आवश्यकता होती है।

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

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