2008-10-09 5 views
47

के साथ एनम साझा करना मेरे पास कुछ अलग-अलग एप्लिकेशन हैं जिनमें से मैं एक सी # एनम साझा करना चाहता हूं। मैं नियमित रूप से एक आवेदन और डब्ल्यूसीएफ सेवा के बीच एक enum घोषणा साझा करने के बारे में पता नहीं लगा सकता।डब्ल्यूसीएफ सेवा

यहां स्थिति है। मेरे पास 2 लाइटवेट सी # destop ऐप्स और एक डब्ल्यूसीएफ webservice है कि सभी को enum मानों को साझा करने की आवश्यकता है।

ग्राहक 1

Method1(MyEnum e, string sUserId); 

ग्राहक 2 है है

Method2(MyEnum e, string sUserId); 

वेब सेवा है

ServiceMethod1(MyEnum e, string sUserId, string sSomeData); 

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

[ServiceContract] 
[ServiceKnownType(typeof(MyEnum))] 
public interface IMyService 
{ 
    [OperationContract] 
    ServiceMethod1(MyEnum e, string sUserId, string sSomeData); 
} 

[DataContract] 
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue }; 

तो .... वहाँ एक WCF सेवा और अन्य applictions के बीच एक enum साझा करने के लिए कोई तरीका है?

+0

वेबसाइसेस में enums से बचने के लिए अनुशंसा की जाती है क्योंकि वे सूक्ष्म पीछे की संगत समस्याओं का निर्माण करते हैं। Http://stackoverflow.com/a/788281/52277 –

+1

इस मामले में लागू नहीं होता है; संदर्भित पिछड़ा संगतता मुद्दे * लौटने के कारण * एक ग्राहक के लिए एक enum (जो उन्हें स्पष्ट रूप से तोड़ सकता है) के कारण इनपुट के रूप में एक enum लेने के कारण हैं। –

उत्तर

45

सामान्य पुस्तकालय का उपयोग करना ठीक होना चाहिए। गणना क्रमिक हैं और डेटाकंट्रैक्ट विशेषताओं की आवश्यकता नहीं है।

देखें: http://msdn.microsoft.com/en-us/library/ms731923.aspx

गणन प्रकार के। ध्वज गणना समेत गणना क्रमिक है। वैकल्पिक रूप से, गणन प्रकार DataContractAttribute विशेषता के साथ चिह्नित किया जा सकता है, इस स्थिति में हर सदस्य कि क्रमबद्धता में भाग EnumMemberAttribute के साथ चिह्नित किया जाना चाहिए विशेषता

संपादित करें: होने के साथ फिर भी, वहाँ होना चाहिए कोई समस्या नहीं enum डेटाकंट्रैक्ट के रूप में चिह्नित किया गया है और क्लाइंट पुस्तकालयों का उपयोग कर रहा है।

+4

वेबसाइसेस में enums से बचने के लिए अनुशंसा की जाती है क्योंकि वे सूक्ष्म पीछे की संगत समस्याओं का निर्माण करते हैं। देखें http://stackoverflow.com/a/788281/52277 –

0

आप अपने Enum सदस्यों को पूर्णांक मान निर्दिष्ट कर सकता है और सिर्फ पूर्णांक का उपयोग हस्तांतरण करने और आवश्यकतानुसार उन्हें अपने Enum प्रकार

+4

enum के उद्देश्य को हराता है। – Gaui

33

मैं एक पुरानी सेवा संदर्भ या कुछ और के साथ कुछ मुद्दों रहा होगा में वापस डाली। मैं वापस गया और enum युक्त एक आम पुस्तकालय बनाया, और सब कुछ ठीक काम करता है। मैंने बस सेवा इंटरफ़ेस की फ़ाइल का उपयोग संदर्भ जोड़ा।

using Common; 

[ServiceContract] 
[ServiceKnownType(typeof(MyEnum))] 
public interface IMyService 
{ 
    [OperationContract] 
    ServiceMethod1(MyEnum e, string sUserId, string sSomeData); 
} 

और मैं निम्नलिखित गिरा:

[DataContract] 
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue }; 

मुझे लगता है के बाद से enum ServiceKnownType के माध्यम से संदर्भित है, यह [DataContract] या के साथ बाहरी पुस्तकालय में चिह्नित किए जाने की जरूरत नहीं थी [गणनाकार ]

+0

मेरे लिए अच्छी तरह से काम किया। धन्यवाद! – Contango

+0

भी मेरे लिए अच्छी तरह से काम किया। धन्यवाद! – ari

32

मुझे काफी अजीब समस्या थी और सोचा कि यह आपके लिए दिलचस्प हो सकता है। मुझे भी समस्याएं थीं कि जब मैंने अपने डेटा अनुबंध में enums का उपयोग किया तो मुझे कनेक्शन स्टॉप मिला। वास्तविक समस्या क्या थी यह जानने के लिए मुझे थोड़ी देर लग गई: मैंने इंट मानों के साथ enums का उपयोग किया। उन्होंने 0 के बजाय 1 से शुरू किया। जाहिर है डब्ल्यूसीएफ की आवश्यकता है कि सीरियलाइजेशन के लिए 0 के बराबर एक एनम मान है।यदि आप अपनी गणना के भीतर कोई मूल्य नहीं बताते हैं, तो 0 से शुरू होने के लिए स्वचालित int मान मैपिंग किया जाएगा, इसलिए सब कुछ ठीक है। लेकिन जब आप कुछ अन्य enum परिभाषा पेस्ट करते हैं जहां 0 मान असाइन नहीं किया जाता है तो आप डब्ल्यूसीएफ के माध्यम से अपने क्लाइंट को नहीं प्राप्त करेंगे - अजीब लेकिन सच!

+8

मेरी इच्छा है कि मैं आपके जवाब को अरबों बार वोट दे सकता हूं। मैं डेटा अनुबंध को अनदेखा करने में दो घंटे बिताता हूं यह देखने के लिए कि संपत्ति किस समस्या का कारण बन रही है। हां डब्लूसीएफ टीम को कभी-कभी पता है कि कभी-कभी डेटाबेस में लुकअप टेबल पर मैप्स मैप किए जाते हैं, जहां आमतौर पर पहली प्रविष्टि एक होती है और शून्य नहीं होती है। – MotoWilliams

+0

मोटोविल्लियम्स ने मूल रूप से कहा है कि मैं वास्तव में क्या कहना चाहता था। जब तक मुझे यह समाधान नहीं मिला, तब तक इस समस्या को हल करने का प्रयास करने के बाद इस उत्तर को मिला। मेरे लिए पूरी तरह से काम किया। – petstran

+0

मुझे भी इस सूक्ष्म बग का सामना करना पड़ा, इसे डीबग करना मुश्किल है। एमएसडीएन दस्तावेज़ों में इसका उल्लेख है कि शून्य मान के एनमों को क्रमबद्ध नहीं किया जाएगा (या अधिक सटीक रूप से, मानचित्रण के बिना मूल्यवान मूल्य)। https://msdn.microsoft.com/en-us/library/aa347875%28v=vs.110%29.aspx –