2010-01-11 22 views
10

मैं अपने WCF सेवा के लिए डेटा अनुबंध वर्ग निम्नलिखित है:WCF सेवा मूलभूत मूल्यों

[DataContract(Name = "MyClassDTO")] 
public class MyClass 
{ 
    private string name = "Default Name"; 

    [DataMember] 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
} 

जब मैं का उपयोग दृश्य स्टूडियो के जोड़े सेवा संदर्भ एक WCF सेवा संदर्भ उत्पन्न करने के लिए उत्पन्न DataContract कुछ इस तरह दिखता काम करते हैं:

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] 
[System.Runtime.Serialization.DataContractAttribute(Name = "MyClassDTO", Namespace = "xxx")] 
[System.SerializableAttribute()] 
public partial class MyClassDTO : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged 
{ 

    [System.Runtime.Serialization.OptionalFieldAttribute()] 
    private string NameField; 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public string Name 
    { 
     get 
     { 
      return this.NameField; 
     } 
     set 
     { 
      if ((object.ReferenceEquals(this.NameField, value) != true)) 
      { 
       this.NameField = value; 
       this.RaisePropertyChanged("Name"); 
      } 
     } 
    } 
} 

इसका मतलब है कि, डिफ़ॉल्ट मान "डिफ़ॉल्ट नाम" खो जाए और निम्न व्यवहार होता है:

MyClassDTO mcdto = new MyClassDTO(); 
serviceClient.DoSomething(mcdto); 


[OperationContract] 
void DoSomething(MyClass mc){ 
    mc.Name //<-- == null but I want it to be "Default Name" 
} 

क्या इस तरह से डेटा अनुबंध को कॉन्फ़िगर करने का कोई तरीका है, परिभाषित डिफ़ॉल्ट मान "डिफ़ॉल्ट नाम" खो नहीं जाता है?

में अतिरिक्त जानकारी के: मैं संदर्भित assemblys, उदा प्रकार के पुन: उपयोग के बिना एक सेवा संदर्भ का उपयोग क्लाइंट की तरफ वर्ग MyClass डीटीओ उत्पन्न एक सर्वर साइड वर्ग MyClass

उत्तर

3

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

[DataContract(Name = "MyClassDTO")] 
    public class MyClass 
    { 
     private string name; 

     public MyClass() 
     { 
      Init(); 
     } 

     [DataMember] 
     public string Name 
     { 
      get{ return name; } 
      set 
      { 
       if (!String.IsNullOrEmpty(value)) 
       { 
        name = value; 
       } 
      } 
     } 

     private void Init() 
     { 
      name = "Default Name"; 
     } 

     [System.Runtime.Serialization.OnDeserializing] 
     private void OnDeserializing(StreamingContext ctx) 
     { 
      Init(); 
     } 
    } 
2

हममम .. मैं सोचा वहाँ [DefaultValue(...)] के साथ कुछ चीजें हैं जो काम करेगा थे, लेकिन जाहिरा तौर पर नहीं है कि के बारे में पता नहीं है है; मैं थोड़ी उलझन में हूं कि आपको null क्यों मिलता है, हालांकि - आपने इसे किसी भी डिफ़ॉल्ट के बारे में नहीं बताया है, इसलिए मैं आउटपुट में "Default Name" की अपेक्षा करता हूं। आप कुछ डिफ़ॉल्ट कोड (या एक ShouldSerialize*/*Specified) है हैं तो आप की कोशिश कर सकते:

[DataMember(EmitDefaultValue=true)] 
public string Name { 
    get { return name; } 
    set { name = value; } 
} 

लेकिन फिर से - मैं पूरी तरह यकीन नहीं है तुम क्यों पहली जगह में एक null देख रहे हैं।

मैं बस में VS2008 WCF टेम्पलेट के आधार पर कुछ के साथ इस परीक्षण किया है, और यह ठीक काम करता है:

using (var client = new Service1Client()) { 
    var result = client.GetDataUsingDataContract(); 
    Console.Write(result.Name); // "Default Name" 
} 
+0

हाँ दिशा सर्वर के साथ -> क्लाइंट यह ठीक काम करता है। लेकिन दिशा में क्लाइंट -> सर्वर यह काम नहीं करता है। ध्यान दें कि क्लाइंट साइट पर डेटाकंट्रैक्ट क्लास MyClassDTO एक जेनरेट किया गया है जिसका उपयोग केवल क्लाइंट साइड पर किया जाता है।क्लाइंट MyClass नहीं जानता है और सर्वर पक्ष क्लास MyClassDTO – Fabiano

2

मैं नहीं मानता कि XML स्कीमा एक तत्व का डिफ़ॉल्ट मान का वर्णन की अनुमति देता है । इसका अर्थ यह है कि, जहां तक ​​आपकी सेवा के ग्राहक का संबंध है, वहां कोई डिफ़ॉल्ट मान नहीं है।

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

+0

से अवगत नहीं है क्योंकि ऐसा इसलिए है क्योंकि मैं इसे संवाद करने का एक तरीका ढूंढ रहा हूं :-) लेकिन ऐसा लगता है (जैसा आपने कहा था) ऐसा करने का कोई तरीका नहीं है यह। – Fabiano

1

deserialization के दौरान, आपकी संपत्ति का 'सेट' तर्क निष्पादित किया जाएगा, ताकि आप वहां शून्य की जांच कर सकें और उस बिंदु पर जो भी वांछित डिफ़ॉल्ट सेट कर सकें।

+0

यह मेरा लक्ष्य प्राप्त करने का एकमात्र तरीका प्रतीत होता है। लेकिन deserialization के दौरान कोई कन्स्ट्रक्टर नहीं कहा जाता है और वस्तु शुरू नहीं होती है, इसलिए आपको कॉन्स चर का उपयोग करना होगा – Fabiano

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