2016-09-30 18 views
7

में एनम पैराम पास करने के लिए सर्वश्रेष्ठ अभ्यास मेरे पास एक शानदार वेब एपीआई प्रोजेक्ट है, और मेरे पास 2 अलग-अलग एनम परिदृश्य हैं जिन्हें मैं सबसे अच्छा अभ्यास करने के बारे में अनिश्चित हूं।वेब एपीआई

परिदृश्य 1: सरल Enum परम

मेरे API पद्धति एक पैरामीटर ruleType कहा जाता है, मान्य मान EmailAddress और IPAddress होने के साथ की आवश्यकता है। वेब एपीआई परियोजना के भीतर मेरे enum इस तरह दिखता है:

public enum RuleType 
{ 
    None = 0, 
    EmailAddress = 1, 
    IPAddress = 2 
} 

इस परिदृश्य के लिए मेरा प्रश्न है, मैं एपीआई के लिए अपने अनुरोध में ?ruleType=EmailAddress का उपयोग करना चाहिए (जो स्वत: एपीआई विधि के भीतर मेरी RuleType संपत्ति के लिए है कि मूल्य बांधता)? यदि हां, तो RuleType परमिट को सत्यापित करने के लिए सबसे अच्छा तरीका कितना सर्वोत्तम है, क्या वैध नियम टाइप एनम मान है?

परिदृश्य 2: एक एकल परम

मेरे API पद्धति के लिए एकाधिक Enum मान एक वैकल्पिक fields परम जो है आपके पास कोई अतिरिक्त डेटा है कि वापस आ जाना चाहिए निर्दिष्ट करने के लिए अनुमति देता है,। जैसे &fields=ruleOwner,rule। यह प्रतिक्रिया में डेटा के उन 2 अतिरिक्त बिट्स वापस करेगा।

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

public enum OptionalField 
{ 
    None = 0, 
    RuleOwner = 1, 
    Rule = 2, 
    etc. 
} 

क्या सबसे अच्छा अभ्यास यहाँ होगा:

यह Enum है? मैं bitwise enums में देख रहा था, इसलिए एपीआई अनुरोध में एक ही मूल्य भेजा गया जिसके परिणामस्वरूप fields का कोई संयोजन हुआ लेकिन यह नहीं पता था कि यह वेब एपीआई के साथ अच्छा काम करेगा या नहीं, या इसके बारे में जाने का आमतौर पर बेहतर तरीका है ?

उत्तर

1

यह यूआरआई "मानव पठनीय" बनाने का सबसे अच्छा अभ्यास है। तो मैं यह भी समझ सकता हूं कि आप एक स्ट्रिंग के रूप में Enum का उपयोग क्यों कर रहे हैं। लेकिन जैसा कि हिस्टोकोलेव ने कहा था कि आपको एक कस्टम मॉडल बाइंडर लिखना है।

फ़ील्ड में मुझे लगता है कि आपको enums के संयोजन का उपयोग नहीं करना चाहिए। क्योंकि यह समझना मुश्किल है। शायद आप enum प्रविष्टि

public enum OptionalField 
{ 
    None = 0, 
    RuleOwner = 1, 
    Rule = 2, 
    RuleAndRuleOwner = 3, 
    etc. 
} 
0

एकाधिक मान या नहीं, यदि आप एक स्ट्रिंग के रूप में एनम का उपयोग कर रहे हैं, तो आपको इसे मैन्युअल रूप से पार्स करना होगा। .NET में Enums पूर्णांक हैं इसलिए यदि आप डिफ़ॉल्ट मॉडल बाइंडर को enum भेजना चाहते हैं तो आपको इसे ऐसा करना होगा: ?ruleType=1

आप अपना खुद का मॉडल बाइंडर लिख सकते हैं जो स्ट्रिंग स्वीकार करेगा, लेकिन आपको खुद से पूछना होगा कि हम ऐसा क्यों कर रहे हैं? यदि आप चाहते हैं कि उपयोगकर्ता यूआरएल को आसानी से पहचानने में सक्षम हो तो स्ट्रिंग का उपयोग करें। यदि पूर्णांक का उपयोग न करने का कोई कारण नहीं है। जैसा कि आपने कहा था, आप कई मानों को गठबंधन करने के लिए FlagsAttribute का उपयोग कर सकते हैं।

+1

संख्याओं के बजाय स्ट्रिंग का उपयोग करने का एक अच्छा कारण है, हालांकि: संख्याएं आंतरिक कार्यान्वयन विवरण हैं, जबकि एपीआई एप्लिकेशन के लिए सार्वजनिक फ्रंट-एंड है। सदस्यों को 'enum' में पुन: व्यवस्थित करने के वैध कारण हैं, लेकिन डिफ़ॉल्ट रूप से ऐसा करने से संख्यात्मक मान बदल जाएंगे - लेकिन नाम नहीं। आंतरिक रूप से कोड के लिए, संख्यात्मक मानों में कोई फर्क नहीं पड़ता है, क्योंकि सब कुछ समान 'enum' परिभाषा का संदर्भ देता है। बाहरी कॉलर्स को वह लाभ नहीं मिलता है, और सर्विस कोड के अपडेट में निरंतरता सुनिश्चित करने के लिए स्ट्रिंग फॉर्म का उपयोग करना चाहिए। –

+0

हां, लेकिन यदि आप स्ट्रिंग का उपयोग करते हैं तो आप आसानी से समग्र मान ([ध्वज]) भेजने की क्षमता खो देते हैं। ऑर्डरिंग समस्या मैन्युअल रूप से पूर्णांक सेट करके तय की जा सकती है। –

0

सबसे आसान जवाब है, "इससे कोई फर्क नहीं पड़ता"।

अपने नियंत्रक विधि में पैरामीटर गणना प्रकार

public IHttpActionResult Foo(RuleType ruleType) 

वेबएपीआई में, यह काम करती है की है - कोई बात नहीं अगर ग्राहक अनुरोध URL ?ruleType=1 या ?ruleType=EmailAddress

रूप parmeter मान निर्दिष्ट करता है

यदि क्लाइंट एक मान निर्दिष्ट करता है जो गणना के लिए मान्य नहीं है, तो एक अपवाद फेंक दिया जाता है (The parameters dictionary contains a null entry for parameter 'ruleType' of non-nullable type 'RuleType' for method 'Foo' ... और क्लाइंट को 400 Bad Request प्रतिक्रिया मिलती है।

0

परिदृश्य 2 वहाँ के लिए समर्थन में [झंडे] विशेषता

[Flags] 
public enum OptionalField 
{ 
    None = 0, 
    RuleOwner = 1, 
    Rule = 2, 
    RuleAdministrator = 4, 
    RuleEditor = 8, 
    ...etc 
} 

कौन सा this SO post

में वर्णन किया गया Christian पहले से ही अपने जवाब में कहा गया है यह शायद अच्छा नहीं है का उपयोग कर Enums में bitmask कार्यों के लिए सी # में बनाया गया है एक आरईएसटी एपीआई में इसका इस्तेमाल करने का अभ्यास करें लेकिन इसे काम करना चाहिए।