2012-05-28 7 views
6

मैं MediaTypeFormatter का एक कस्टम कार्यान्वयन करने की कोशिश कर रहा हूं, लेकिन विधि bool CanReadType(Type type) को हमेशा IKeyValueModel प्रकार के साथ बुलाया जाता है, इसके बजाय मेरे प्रकार MyProductकस्टम मीडिया टाइप टाइपरेटर, क्यों IKeyValueModel और मेरे मॉडल प्रकार नहीं?

मेरी एपीआई नियंत्रक में मेरे पास है:

[HttpPost] 
public Task Save(MyProduct product) 

मैं कुछ उदाहरण (example 1, example 2) को देखा है, और मैं भी कोड की कोशिश की है:

protected override bool CanReadType(Type type) 
{ 
    if (type == typeof(IKeyValueModel)) 
     return false; 
     return true; 
} 

लेकिन तब मैं एक " MissingMethodException: इस ऑब्जेक्ट के लिए कोई पैरामीटर रहित कन्स्ट्रक्टर परिभाषित नहीं किया गया है ", क्योंकि मेरे मॉडल प्रकार में पैरामीटर रहित कन्स्ट्रक्टर नहीं है। तो ऐसा लगता है क्योंकि CanReadTypeIKeyValueModel पर झूठा लौटाता है, ढांचा एक और मीडिया प्रकार फॉर्मेटर का उपयोग करता है। दरअसल, विधि OnReadFromStreamAsync कभी हिट नहीं होती है।

मैं अपने मॉडल को deserialized कैसे नियंत्रित करने में सक्षम होना चाहता हूं, मैं असली प्रकार प्राप्त करना चाहता हूं और IKeyValueModel नहीं।

यह पहले से ही मॉडल बाइंडर्स के साथ एमवीसी में बहुत अच्छा काम कर रहा था।

चीयर्स।

अद्यतन 2012/05/29:

अगर मैं डिफ़ॉल्ट json फ़ॉर्मेटर को दूर यह काम करता है:

public static void RegisterApis(HttpConfiguration config) 
    { 
     config.Formatters.Clear(); 

लेकिन तब मैं दोनों को रखने के लिए पसंद करेंगे, मैं कैसे यह संकेत दे सकती है जो एक मैं उपयोग करना चाहते हैं?

सम्मान।

+0

आपको कस्टम 'MediaTypeFormatter' की आवश्यकता क्यों है? – Aliostad

+1

नवीनतम कोड (रात का निर्माण) आज़माएं, वर्तमान स्रोत में कोई IKeyValueModel नहीं है। इसे टीम द्वारा हटा दिया/हटा दिया गया है। http://aspnetwebstack.codeplex.com/SourceControl/network/forks/BradWilson/AspNetWebStack/changeset/changes/5648aed69341 – user960567

+0

@Aliostad मुझे एक कस्टम मीडियाटाइपफॉर्मेटर की आवश्यकता है ताकि यह नियंत्रित किया जा सके कि मेरी ऑब्जेक्ट्स जेएसओएन को क्रमबद्ध और deserialized कैसे हैं। – vtortola

उत्तर

3

आप क्रमबद्धता को नियंत्रित करने की जरूरत है, यह Json.NET के लचीलेपन सुविधाओं का उपयोग करने (देखें here, here और here) के बजाय को नियंत्रित सिर्फ इतना है कि के लिए एक मीडिया प्रकार फ़ॉर्मेटर लिखने के लिए बेहतर है।

Json.NET now एएसपी.NET वेब एपीआई में डिफ़ॉल्ट फॉर्मेटर है।


अद्यतन

मेरे वस्तुओं parameterless निर्माणकर्ता और गुण केवल पढ़ने के लिए कर रहे हैं नहीं है। मेरे पास ऑब्जेक्ट्स भी हैं जो डायनामिक ऑब्जेक्ट से प्राप्त होते हैं, इसलिए मान लें कि मेरी व्यावसायिक संस्थाएं छोटी नहीं हैं।

मैं शायद आपको दिखा सकता हूं कि पैर में खुद को कैसे शूट करें। लेकिन मैं यह समझाना चाहूंगा कि इन समस्याओं को दूर करने से कैसे बचें क्योंकि मेरा मानना ​​है कि आप उन्हें रखते हैं क्योंकि आपके दृष्टिकोण में विरोधी पैटर्न हैं।

सबसे पहले, जो आप खोज रहे हैं वह कोई अन्य मीडिया प्रकार फ़ॉर्मेटर नहीं है। आपको एक अलग धारावाहिक की आवश्यकता है या बस अपने धारावाहिक को कॉन्फ़िगर करने की आवश्यकता है।

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

आप अपनी इकाइयों को मानचित्र बनाने के लिए ऑटोमैपर का उपयोग कर सकते हैं ताकि मॉडल को और विकास लागत न हो। यह हमेशा प्रस्तुति परत से अपने डोमेन मॉडल को सारणित करने की सलाह दी जाती है।

+0

मेरी ऑब्जेक्ट्स में पैरामीटर रहित कन्स्ट्रक्टर नहीं हैं और गुण केवल पढ़ने योग्य हैं। मेरे पास डायनामिक ऑब्जेक्ट से प्राप्त ऑब्जेक्ट्स भी हैं, इसलिए मान लें कि मेरी व्यावसायिक संस्थाएं छोटी नहीं हैं। मैं वास्तव में हुड के तहत JSON.NET का उपयोग कर रहा हूं, लेकिन मैं इसे कस्टम तरीके से उपयोग करने की आवश्यकता है। – vtortola

+0

@NullOrEmpty मैंने अपना जवाब अपडेट किया है। – Aliostad

+0

आपके इनपुट के लिए धन्यवाद, लेकिन सवाल कुछ और के बारे में है। हम वास्तव में डीएसओ बना रहे हैं जब हम JSON इकाइयां बनाते हैं, जो JSON का बिंदु है:) इसलिए, मुझे यह नियंत्रित करने का एक तरीका चाहिए कि जेएसओएन डीटीओ कैसे मेरी व्यावसायिक संस्थाओं में/से बदलता है ... जैसा कि मैंने पहले ही कहा है, मेरी व्यावसायिक वस्तुएं गतिशीलता (सिस्टम। गतिशील) हैं, यह सेवा के बारे में नहीं है किसी ऑब्जेक्ट को अपनी सभी संपत्तियों के साथ ialize करें, यह मेरे डायनामिक व्यावसायिक ऑब्जेक्ट और वाइसवर्सा से JSON ट्रांसपोर्ट ऑब्जेक्ट बनाने के बारे में है। – vtortola

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

  • कोई संबंधित समस्या नहीं^_^