2012-11-28 11 views
13

मुझे एहसास है कि वेब एपीआई आरईएसटी केंद्रित है, लेकिन मैं अभी भी एक नियंत्रक विधि को कॉन्फ़िगर करना चाहता हूं जो कमांड/प्रतिक्रिया परिदृश्य को संभाल सकता है। अब तक मैं सफल नहीं हुआ हूं ... क्या एक एकल एपीआई एंडपॉइंट द्वारा मान्यता प्राप्त निम्न वर्ग संरचना का कोई तरीका है?वेब एपीआई में पॉलिमॉर्फिज्म: सिंगल एंडपॉइंट संभव है?

[Serializable] 
public abstract class Command{ 
    public int CommandId{get; set;} 
} 
[Serializable] 
public class RegisterNewPersonCommand:Command{ 
    public string Name{get; set;} 
} 
//etc... various Command subclasses. Similar thing for Responses. 

//now have a single endpoint to Handle Commands 
public class CommandsController : ApiController{ 
    public Response HandleCommand(Command command){ 
     //handle Command based on which subclass it is 
     //return appropriate Response subclass 
    } 
} 

इस प्रकार अब तक यह इस परिदृश्य संभाल कर सकते हैं क्रमबद्धता प्रणाली प्रतीत नहीं होता है, लेकिन मैं किसी को उम्मीद है कि बाहर बहुरूपता वेब एपीआई में काम करने के लिए वहाँ यह :)

+0

भले ही यह काम करता है, यह किसी भी कोड का पुन: उपयोग करने में कैसे मदद करता है? – Aliostad

+0

मैं अपने नियंत्रक में कोड को कम करना चाहता हूं। कमांड के प्रत्येक उप-वर्ग ('हैंडल न्यूयूसर कमांड (न्यू यूसर कॉमांड) {}, हैंडल यूज़र पासवर्ड वर्च कॉमांड (यूजरपासवर्ड चेंज कॉमांड) {}', आदि) के लिए बॉयलरप्लेट विधि के बजाय, एकल 'हैंडल कॉमांड' विधि प्रतिमान को पार करने के लिए प्रतिबिंब और आईओसी का उपयोग करने के लिए जिम्मेदार होगी उचित डोमेन तर्क। – smalltowndev

उत्तर

14

करने के लिए आदेश में एक रास्ता मिल गया है , आपको टाइप नाम हैंडलिंग सक्षम करने की आवश्यकता होगी और डेटा में प्रकार की जानकारी होनी चाहिए।

यदि आपको अपने परिदृश्य में JSON का उपयोग कर रहे WebApiConfig.cs में TypeNameHandling को चालू करने की आवश्यकता होगी:

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = 
    Newtonsoft.Json.TypeNameHandling.All; 

फिर, सामग्री शरीर है कि आप अपने HandleCommand(...) कार्रवाई करने के लिए भेज रहे हैं प्रकार जानकारी होनी चाहिए:

{"$type":"MvcApplication.Models.RegisterNewPersonCommand, MvcApplication", ... } 

एक्सएमएल के लिए, आप DataContract के KnownType का उपयोग करना होगा ...

वैसे, है वहाँ एक वाई विशिष्ट कारण आप [Serializable] का उपयोग क्यों कर रहे हैं (चूंकि पॉको प्रकार और [DataContract] प्रकार भी समर्थित हैं ...)?

+0

यह सही विचार प्रतीत होता है। $ प्रकार की जानकारी शामिल करने के लिए HttpClient को कॉन्फ़िगर करने का कोई तरीका है? मेरे परीक्षणों में, 'var task = client.PostAsJsonAsync ("api/command/handlecommand", testCommand); जब यह जेसन को क्रमबद्ध करता है तो इसमें $ प्रकार की जानकारी शामिल नहीं होती है। – smalltowndev

+1

इसने मेरे प्रश्न का उत्तर दिया और क्लाइंट एंड पर स्वरूपण निर्दिष्ट करने का तरीका जानने में मेरी सहायता की। इसके लायक होने के लिए, सबसे सरल क्लाइंट कोड कुछ ऐसा दिखता है: 'निजी शून्य SendCommand (कमांड कमांड) {var json = new jsonMediaTypeFormatter {SerializerSettings = {TypeNameHandling = TypeNameHandling.All}}; var प्रतिक्रिया = client.PostAsync ("api/कमांड/हैंडल कमांड ", कमांड, जेसन)। रिसेट; // हैंडल प्रतिक्रिया}' – smalltowndev

+0

इससे मेरी मदद की गई .. मुझे इंटरनेट पर खोजने के लिए एकमात्र अन्य चीज़ यह थी कि इंटरफ़ेस क्रमबद्ध नहीं हैं, जो कुछ मैं हमेशा के लिए जानता हूं , लेकिन जेसन सीरियलाइजेशन के सभी जादूओं के कारण नेट में मुझे भूलना प्रतीत होता था :) तो कोई आईसीओलेक्शन, आईन्यूमेरेबल, इसके बजाय सूची <> आदि का उपयोग करें ... अब मेरे पास पॉलिमॉर्फिक सीरियलाइजेशन काम कर रहा है :) और अब मुझे आश्चर्य है कि मुझे होना चाहिए मेरे डीटीओ की चपेट में: पी – GetFuzzy