2010-03-22 11 views
12

मैं डब्ल्यूसीएफ में एक सेवा विधि से एक जटिल प्रकार वापस करने की कोशिश कर रहा हूं। मैं सी # और .NET 4 का उपयोग कर रहा हूं। यह जटिल प्रकार invariant (उसी तरह .net तार हैं) का मतलब है। इसके अलावा, सेवा केवल इसे लौटाती है और कभी भी इसे तर्क के रूप में प्राप्त नहीं करती है।डब्ल्यूसीएफ डाटाकंट्रैक्ट रीडोनली गुणों के साथ

यदि मैं गुणों पर केवल गेटर्स को परिभाषित करने का प्रयास करता हूं तो मुझे रन टाइम त्रुटि मिलती है। मुझे लगता है कि ऐसा इसलिए है क्योंकि कोई सेटर्स क्रमिकरण विफल होने का कारण बनता है। फिर भी, मुझे लगता है कि यह प्रकार invariant होना चाहिए।

उदाहरण:

[DataContract] 
class A 
{ 
    [DataMember] 
    int ReadOnlyProperty {get; private set;} 
} 

सेवा क्रमबद्धता के साथ एक समस्या की वजह से लोड करने के लिए विफल रहता है।

क्या डब्लूसीएफ डेटाकंट्रैक्ट पर रीडोनली गुण बनाने का कोई तरीका है? शायद serializer की जगह से? यदि हां, तो कैसे? यदि नहीं, तो आप इस समस्या के लिए क्या सुझाव देंगे?

धन्यवाद,
आसफ

+0

आप केवल पढ़ने के लिए फ़ील्ड का उपयोग करने में सक्षम हो सकता (* नहीं गुण *) और उन्हें अपने वर्ग के निर्माण में आरंभ कर देगा। इसके अलावा ..., संभावित डुप्लिकेट: http://stackoverflow.com/q/1873741/945456 –

+0

ऑटो-कार्यान्वित केवल-केवल गुणों के लिए अपरिवर्तनीय कक्षाओं और सी # -6.0 के समर्थन के साथ आज यह और भी महत्वपूर्ण है। – binki

उत्तर

1

डेटामेम्बर फ़ील्ड को पढ़ा नहीं जा सकता है, क्योंकि wcf ऑब्जेक्ट को क्रमबद्ध नहीं करता है और हर बार जब deserialization प्रारंभ होता है तो डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करके नया ऑब्जेक्ट उदाहरण बनाता है। डिस्पैचर्स deserialization के बाद फ़ील्ड मान सेट करने के लिए सेटर्स का उपयोग करें।

लेकिन सभी ऊपरी पाठ

उन्हें वास्तव में केवल पढ़ने के लिए बनाने के लिए, सर्वर तर्क बनाने के लिए, thiss फ़ील्ड मान मान्य बड़ी गलती :) हो सकता है।

-1

आप सेटर निजी बनाने की कोशिश की है?

कुछ की तरह:

public string MyProperty 
{ 
get; 
private set; 
} 
+0

हाँ। यह बिल्कुल मेरी समस्या है। –

+0

तो यह तय है? या यह वही है जो आप कोशिश कर रहे थे? –

+0

यह काम नहीं करता है। यदि मैं MyProperty को एक [DataMember] बनाता हूं तो मुझे क्रमिकरण से, मेरी सर्वोत्तम समझ के कारण रनटाइम त्रुटि मिलती है। जैसे ही सेवा लोड हो जाती है - क्लाइंट ऑपरेशन के दौरान भी नहीं। –

13

समर्थन मैदान पर [DataMember] शब्दों में कहें, तो आप एक सेटर जरूरत नहीं होगी।

+0

लेकिन यह नहीं होगा पढ़ा जाए, और यह व्यक्त नहीं करेगा कि इसे पढ़ा जाना चाहिए। –

+4

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

+0

यदि आप सेवा में पास हो जाते हैं तो आप मूल्य को अनदेखा कर सकते हैं? केवल पढ़ने का मतलब है कि सेवा केवल रिटर्न यह? –

7

अपने सेटर को धारावाहिक को संतुष्ट करने के लिए सार्वजनिक बनाएं, लेकिन बसटर पर कुछ भी न करें। 'Purist' नहीं है लेकिन यह

public string MyProperty 
{ 
    get { 
     return this._myProperty 
    } 
    set {} 
} 
0

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

3

आप गुण केवल पढ़ने के लिए नहीं कर सकते हैं, फिर भी आप गुण के बजाय अपने अनुबंध के क्षेत्र हिस्सा बनाकर केवल पढ़ने के करीब प्राप्त कर सकते हैं:

[DataContract] 
public class A 
{ 
    public class A(){} 
    public class A(int readonlyproperty){ _readonlyproperty = readonlyproperty} 

    [DataMember(Name = "ReadOnlyProperty")] 
    internal int _readonlyproperty; 

    public int ReadOnlyProperty { 
     get {return _readonlyproperty;} 
     private set {_readonlyproperty = value;} 
} 

अगले बनाने के अपने आंतरिक WCF में accesable:

[assembly: InternalsVisibleTo("System.Runtime.Serialization")] 

कैसे अपने लाभ के लिए इस का उपयोग करने पर कुछ नमूने: wcf-and-datacontract-serialization-internals-and-tips

0

असल में, आप रीड-ओनली serializable फ़ील्ड बना सकते हैं।आप के लिए DataContractSerializerSettings की 'SerializeReadOnlyTypes' गुण सेट करने की जरूरत है 'यह सच है', जब DataContractSerializer, जैसा कि नीचे का निर्माण:

var xmlSerializer = new DataContractSerializer(typeof(yourTypeHere), new DataContractSerializerSettings {SerializeReadOnlyTypes=true}); 

देखें MSDN वर्णन और विवरण, यहाँ: https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializersettings(v=vs.110).aspx

0

WCF सक्षम करने की जरूरत है संपत्ति को क्रमबद्ध/deserialize करने के लिए, जो एक निजी संपत्ति के साथ संभव नहीं है। एक केवल पढ़ने के लिए संपत्ति (जटिल प्रकार के अंदर) करवाने के लिए:

  • डेकोरेट वर्ग के रूप में [DataContract (IsReference = true)]
  • के रूप में [DataMember]
  • लोक प्राप्त प्रत्येक/संपत्ति डेकोरेट आंतरिक सेट
[DataContract(IsReference = true)] 
    public class Format : ValueObject<Format> 
    { 
     [DataMember] 
     public int Height { get; internal set; } 
    } 
संबंधित मुद्दे