2013-06-14 13 views
7

के लिए सामान्य नियंत्रक मैं वर्तमान में एएसपी.नेट एमवीसी 4 वेब एपीआई में ओडाटा एंडपॉइंट्स के साथ प्रयोग कर रहा हूं। मुझे अवधारणा पसंद है और हमारी परियोजना में इसका उपयोग करने के कुशल तरीकों के साथ आने का प्रयास करें। मैं कर सकते हैंएएसपी.नेट वेबएपीआई: ओडाटा एंडपॉइंट

public IQueryable GetAll(string entityName); 

मानक वेब एपीआई में (के रूप में OData नियंत्रकों के खिलाफ): हम एक सेवा है जो एक IQueryable लौटने में सक्षम है और इनपुट के रूप में एक इकाई का नाम लेता है: एक सवाल मेरे पास है निम्नलिखित है एक सामान्य नियंत्रक बनाएं, जिसे फ़ॉर्म/एपीआई/इकाइयों/{entityName} में बुलाया जा सकता है और IQueryable लौटाता है।

  1. मॉडल में संस्थाओं रजिस्टर: एक OData नियंत्रक के मामले में, मैं निम्नलिखित इकाई-विशिष्ट चरण बाहर ले जाने के।
  2. EntitySetController <> से प्राप्त प्रत्येक इकाई के लिए एक अलग नियंत्रक बनाएं।

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

क्या कोई भी ओडाटा रूटिंग को प्रभावित करके समाधान की सिफारिश कर सकता है?

उत्तर

11

आप एक कस्टम रूटिंग सम्मेलन बना सकते हैं जो एक ही नियंत्रक का चयन करता है इससे कोई फर्क नहीं पड़ता कि इकाई सेट क्या है। उदाहरण के लिए,

public class CustomControllerRoutingConvention : IODataRoutingConvention 
{ 
    public string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap) 
    { 
     return null; 
    } 

    public string SelectController(ODataPath odataPath, HttpRequestMessage request) 
    { 
     return "SomeFixedContrllerNameWithoutTheControllerSuffix"; 
    } 
} 

आप रजिस्टर कर सकते हैं कि मार्ग सम्मेलन निम्नलिखित कोड का उपयोग कर,

IList<IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault(); 
routingConventions.Insert(0, new CustomControllerRoutingConvention()); 
config.Routes.MapODataRoute("OData", "odata", builder.GetEdmModel(), new DefaultODataPathHandler(), routingConventions); 
+1

आपको नल इकाइयों के लिए odataPath की जांच करने की आवश्यकता है। यह मेटा-डेटा प्रश्नों को इंगित करता है जिन्हें डिफ़ॉल्ट मार्ग पर जाने की आवश्यकता होती है। यदि (odataPath.EdmType == null || odataPath.EntitySet == null) वापस शून्य करें; – xt1

+0

इसने एक ही प्रोजेक्ट में v3 और v4 प्राप्त करने में समस्या हल की, क्योंकि आपके पास डुप्लिकेट नियंत्रक नाम नहीं हो सकते हैं, और 406 में एक अलग नियंत्रक नाम के परिणाम पर रूट विशेषता का उपयोग करने का प्रयास कर रहे हैं। नियंत्रक नाम सम्मेलन के लिए EntityV4Controller, लौटने odataPath.NavigationSource.Name + "V4" नियंत्रक मिलेगा। –

+0

मेटाडेटा प्रश्नों की जांच करने के लिए @ xt1 की विधि स्पष्ट रूप से आम है, लेकिन विश्वसनीय नहीं है। हमारे प्रोजेक्ट में ऐसी स्थितियां हैं जहां 'odataPath.EntitySet == null' है, लेकिन यह $ मेटाडेटा अनुरोध नहीं है। मैंने पाया है कि 'ODataSegmentKinds.ServiceBase' और 'ODataSegmentKinds.Metadata' के संयोजन की जांच करना अधिक विश्वसनीय है।(यह एक वी 3 सेवा के लिए है।) –

6

मैं एक ही समस्या के खिलाफ आया था, और एक IODataRoutingConvention के बजाय कोई कस्टम IHttpControllerSelector लेखन समाप्त हो गया। IODataRoutingConvention यदि आपके जेनेरिक नियंत्रक को जेनेरिक की आवश्यकता नहीं है तो एक अच्छा विकल्प दिखता है :)। लेकिन चूंकि IODataRoutingConvention.SelectController() केवल एक स्ट्रिंग देता है, मुझे नहीं लगता कि यह जेनेरिक प्रकार पैरामीटर के साथ नियंत्रक को तुरंत चालू करने के लिए कैसे काम करेगा।

मैंने तय किया कि इस समस्या को एक अच्छे, सामान्य उद्देश्य, ओपन-सोर्स समाधान की आवश्यकता है - इसलिए मैंने एक बनाया: http://entityrepository.codeplex.com। यह अब prerelease है, लेकिन मैं वर्तमान में इस पर बहुत काम कर रहा हूँ। मुझे लगता है कि सही नियंत्रक चुनने के बजाय इसके लिए और भी कुछ है, साझा नियंत्रकों के लिए परिभाषित करने के लिए सामान्य पैटर्न हैं, और डिफ़ॉल्ट रूप से वेब एपीआई ओडाटा दृढ़ता से टाइप और दृढ़ता से नेविगेशन गुणों की अपेक्षा करता है जो इसे पुनः उपयोग करने योग्य कार्यान्वयन को चुनौतीपूर्ण बनाता है।

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