2011-09-16 5 views
7

में एक वस्तु instantiating:WCF मैं नीचे के रूप में दो वर्गों है DataContract निर्माता

[DataContract] 
public class Address 
{ 
    [DataMember] 
    public string Line1 
    [DataMember] 
    public string Line2 
    [DataMember] 
    public string City 
    [DataMember] 
    public string State 
    [DataMember] 
    public string Zip 
} 

[DataContract] 
public class Customer 
{ 
    public Customer() 
    { 
     CustomerAddress = new Address(); 
    } 

    [DataMember] 
    public string FirstName 
    [DataMember] 
    public string LastName 
    [DataMember] 
    public Address CustomerAddress 
} 

अगर मैं ग्राहक वर्ग का उपयोग करता है मेरी सेवा की प्रॉक्सी उत्पन्न क्या होगा? अगर मैं अवधारणा को सही ढंग से समझता हूं तो मुझे लगता है कि ग्राहक वर्ग में निर्माता को क्लाइंट पक्ष में नहीं बुलाया जाएगा और यह अलग-अलग व्यवहार दे सकता है।

मैं ग्राहक वर्ग में उस निर्माता से कैसे छुटकारा पा सकता हूं और अभी भी CustomerAddressAddress प्रकार की संपत्ति है ताकि यह एक गूंगा डीटीओ ऑब्जेक्ट के रूप में व्यवहार करे?

सामान्य परिस्थिति या सर्वोत्तम प्रथाओं का क्या उपयोग है जो लोग इस स्थिति से बचने के लिए उपयोग करते हैं?

उत्तर

6

यदि आप अपनी ऑब्जेक्ट्स को क्रमबद्ध करने के लिए डिफ़ॉल्ट DataContractSerializer का उपयोग करते हैं, तो, हाँ, आपके कन्स्ट्रक्टर को क्रमबद्ध नहीं किया गया है, और इसमें आपके द्वारा किए गए किसी भी तर्क को आपके क्लाइंट द्वारा कॉल नहीं किया जाएगा जब ऑब्जेक्ट deserialized है।

कन्स्ट्रक्टर तर्क को हटाने और नेस्टेड Address कक्षा को पॉप्युलेट करने के बारे में आपके प्रश्न के संबंध में, DataContractSerializer की देखभाल की जाएगी। अगर मैं इस तरह कोड है:

Customer c = new Customer() { 
    FirstName = "David", 
    LastName = "Hoerster", 
    CustomerAddress = new Address() { 
    Line1 = "1 Main Street", 
    City = "Smallville", 
    State = "AA", 
    Zip = "12345" 
    } 
}; 

और फिर लौटने कि एक सेवा विधि से, कि Customer वस्तु Address जानकारी के साथ ठीक से धारावाहिक रूप दिया जाएगा। जेनरेट किए गए क्लाइंट पर प्रॉक्सी Address के बारे में जान जाएगी और सेवा विधि से आने वाली धारा को deserialize करने में सक्षम होगी ताकि आपके Customer ऑब्जेक्ट को ठीक से बनाया जा सके। आपका Customer एक डमी डीटीओ होगा - कोई तर्क नहीं, केवल गुण।

डब्ल्यूसीएफ सीरियलाइजेशन पर हारून स्कोननार्ड के MSDN article देखें जहां वह डेटाकंट्रैक्टसेरियलाइज़र के बारे में बात करता है।

0

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

1

आप ग्राहक उत्पन्न (svcutil का उपयोग कर या "सेवा संदर्भ जोड़ने") है, तो उत्पन्न DataContract देखने की तरह होगा:

[DataContract] 
public class Customer 
{ 
    // empty default constructor 
    public Customer() 
    { 
    } 

    [DataMember] 
    public string FirstName 
    [DataMember] 
    public string LastName 
    [DataMember] 
    public Address CustomerAddress 
} 

आपका कार्यान्वयन विवरण शामिल नहीं किया जाता। जो भी उत्पन्न होता है वह डब्लूएसडीएल में जाता है, जो इस मामले में केवल [DataMember] गुण है।

मैं इसका उल्लेख करता हूं क्योंकि आपका मूल प्रश्न पूछता है: "अगर मैं प्रॉक्सी उत्पन्न करता हूं तो क्या होगा"।


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

आप इसे बनाने के लिए इतना ग्राहक हमेशा आप एक CustomerAddress भेजता है चाहते हैं, तो आप:

  • अशक्त के लिए सर्वर जांच है, if(x.CustomerAddress == null) x.CustomerAddress = new Address();
  • तरह DataMember निशान के रूप में आवश्यक, तो सर्वर कुछ भी पास नहीं होने पर सर्वर एक त्रुटि लौटाएगा: [DataMember(IsRequired=true)] public Address CustomerAddress;

अन्यथा, मुझे नहीं लगता कि उत्पन्न करने के लिए कोई तरीका है डी डब्ल्यूसीएफ क्लाइंट आपके लिए उस क्षेत्र को शुरू करने के लिए।

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