2011-01-13 17 views
8

मैं कुछ डब्ल्यूसीएफ डेटा अनुबंध लिखना शुरू कर रहा हूं जिन्हें अग्रेषित & संस्करण योग्य होना चाहिए। मैं एमएसडीएन आलेख here पढ़ रहा हूं, और सोच रहा था कि अगर किसी के पास enums के बारे में बिंदु # 14 पर स्पष्टीकरण है। यह निम्नानुसार पढ़ता है:डब्ल्यूसीएफ वर्जनिंग एनम्स

14. आपको संस्करणों के बीच गणना सदस्यों को जोड़ना या निकालना नहीं चाहिए। आपको गणना सदस्यों का नाम भी नहीं बदला जाना चाहिए, जब तक आप अपने नाम डेटा अनुबंध मॉडल में रखने के लिए EnumMemberAttribute विशेषता पर नाम संपत्ति का उपयोग नहीं करते हैं।

इसे पढ़ना, मैं इसका मतलब यह मानता हूं कि एक बार enum प्रकाशित होने पर (और ग्राहकों द्वारा उपयोग किया जाता है), आप इसे संगतता को तोड़ने के बिना किसी भी तरह से (मुख्य रूप से जोड़ना/निकालना) संशोधित नहीं कर सकते? (यानी यह एक तोड़ने वाला परिवर्तन होगा)

क्या कोई इसकी पुष्टि कर सकता है?

+0

एनम सदस्य जोड़ना कार्यक्षमता तोड़ नहीं देगा, लेकिन अगर एनम सदस्य उपयोग में है तो हटा देगा। जोड़ना उपयोगी होगा अगर सेवा केवल कार्यान्वयन में बदल दिया गया हो या केवल नया सेवा अनुबंध जोड़ा गया हो। – hungryMind

उत्तर

8

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

There was an error while trying to serialize parameter myType. The InnerException message was 'Enum value 'x' is invalid for type 'myType' and cannot be serialized. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.'. Please see InnerException for more details. 
+0

क्या यह सच है यदि सेवा रिटर्न, कहती है, एनम प्रकार की एक सूची जिसमें पुराने क्लाइंट में अतिरिक्त मूल्य शामिल है? –

6

मैं WCF इंटरफेस पर नहीं enums भेजने की सलाह देते हैं। मान लीजिए आप निम्नलिखित enum है: ग्राहक सेवा संदर्भ अपडेट किए बिना

[ServiceContract] 
public class Service1 
{ 
    [OperationContract] 
    public List<WeekdayEnum> GetWeekdays() 
    { 
     return new List<WeekdayEnum> { WeekdayEnum.Monday }; 
    } 
} 

enum में जोड़े और आप कर रहे हैं:

[DataContract] 
public enum WeekdayEnum 
{ 
    [EnumMember] 
    Monday = 0 
} 

आप WCF अधिक enum वापस करते हैं, सब कुछ अच्छी तरह से काम करेगा अभी भी ठीक:

[DataContract] 
public enum WeekdayEnum 
{ 
    [EnumMember] 
    Monday = 0, 
    [EnumMember] 
    Tuesday = 1 
} 

हालांकि, अगर आप ग्राहक सेवा संदर्भ अपडेट किए बिना सेवा से जोड़ा मान, विरासत ग्राहकों होगा तोड़:

[ServiceContract] 
public class Service1 
{ 
    [OperationContract] 
    public List<WeekdayEnum> GetWeekdays() 
    { // NetDispatcherFaultException on legacy clients that only have Monday 
     return new List<WeekdayEnum> { WeekdayEnum.Monday, WeekdayEnum.Tuesday }; 
    } 
} 

मैं परियोजनाओं में इस के साथ मुद्दों लिया है जहां विरासत ग्राहकों के समर्थन महत्वपूर्ण है। समाधान बस डीटीओ को एनएम के बजाय डब्ल्यूसीएफ पर भेजना है। जैसे WeekdayEnum एक सरल डीटीओ से अधिक मान भेज रहा है द्वारा प्रतिस्थापित किया जा सकता है:

[DataContract] 
public class WeekdayDto 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 
} 

इस तरह, अपनी विरासत क्लाइंट खुश रहते हैं।

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