2010-09-17 11 views
6

के साथ डब्ल्यूसीएफ ओडाटा सेवा हमें एक गतिविधि फ़ीड (फेसबुक के बारे में सोचने) के लिए एक एपीआई प्रदान करने की आवश्यकता है और हमने ओडाटा को एक कोशिश देने का फैसला किया है। हम .NET का उपयोग कर रहे हैं इसलिए हम डब्ल्यूसीएफ डेटा सेवा के लिए गए लेकिन हम इकाई फ्रेमवर्क (या किसी अन्य ओआरएम) का उपयोग नहीं करते हैं, इसलिए हम प्रतिबिंब प्रदाता का उपयोग करेंगे। चूंकि हमारे पास हमारे पुनर्प्राप्ति विधियों के लिए जटिल व्यावसायिक तर्क है, इसलिए हमने उन्हें सेवा संचालन के रूप में बेनकाब करने का निर्णय लिया है। हालांकि हम सामान्य ओडाटा आरईएसटी संसाधन के रूप में हटाएं/अपडेट और एकल इकाई चयन का पर्दाफाश करना चाहते हैं। मेरा सवाल यह है कि हम प्रतिबिंब प्रदाता के लिए डेटा स्रोत कैसे कार्यान्वित कर सकते हैं जो संग्रह तक पहुंच को प्रतिबंधित करता है लेकिन एकल इकाइयों (कुंजी द्वारा अनुरोधित) तक पहुंच की अनुमति देता है, डेली/पुट/पोस्ट क्रियाओं को अनुमति देता है और एकल इकाइयों के बाल संग्रह तक पहुंचने की अनुमति देता है (यानी सेवा/श्रेणियाँ (1)/उत्पाद)। असल में मैं केवल मूल संग्रह तक पहुंच प्रतिबंधित करना चाहता हूं (यानी सेवा/श्रेणियां या सेवा/उत्पाद)प्रतिबिंब प्रदाता

उत्तर

5

यहां कोई अच्छा जवाब नहीं है।

(..) आप InitializeService अंदर उपयोग कर सकते हैं दो सेटिंग उपलब्ध हैं

config.SetEntitySetAccessRule("Feed", EntitySetRights.ReadSingle); 
config.SetEntitySetPageSize("Feed", 1); 

दुर्भाग्य से न तो आप वास्तव में क्या चाहते हैं:

  1. EntitySetRights.ReadSingle आप उस सेट से सिर्फ एक वस्तु लौटने के लिए सीमा। जो विफल रहता है क्योंकि यह इस/श्रेणियों (1)/उत्पादों की अनुमति नहीं देता है और यह एक पंक्ति वापस करने के लिए/श्रेणियां? $ फ़िल्टर = ... भी अनुमति देता है।
  2. SetEntitySetPageSize सर्वर को केवल एक रिकॉर्ड पर मारने वाले प्रारंभिक लोड की मात्रा को प्रतिबंधित करता है लेकिन आप $ skitoken का पालन कर सकते हैं और शेष डेटा एक समय में एक रिकॉर्ड प्राप्त कर सकते हैं और जैसे (1) यह मनमाने ढंग से प्रश्नों की अनुमति नहीं देता है कुंजी भविष्यवाणी करता है।

जो आपको केवल एक यथार्थवादी विकल्प के साथ छोड़ देता है। LINQ अभिव्यक्ति का दौरा करना और यदि आप कोशिश कर रहे हैं तो अनुमति दें।

चूंकि आप प्रतिबिंब प्रदाता का उपयोग कर रहे हैं, इसलिए आपको मूल रूप से IQueryables को अपने 'संदर्भ' वर्ग से वापस लौटने की आवश्यकता है और उन्हें पास करने से पहले अमान्य प्रश्नों की तलाश करनी होगी।

बेहोश दिल के लिए कुछ नहीं।

यदि आप उस पथ पर जाने का निर्णय लेते हैं तो आपको IQueryable wrapping example उपयोगी मिलेगा, और आपको Viteks blog post series on Data Service expressions भी देखना चाहिए।

आशा इस मदद करता है

एलेक्स (OData कार्यक्रम प्रबंधक)

+2

आपको बहुत बहुत धन्यवाद। जब मैं विकल्प का मूल्यांकन कर रहा था तो मैं वास्तव में आपके रैपिंग उदाहरण और कस्टम डेटा प्रदाता श्रृंखला को पढ़ता हूं। पहला समाधान वास्तव में इतना बुरा प्रतीत नहीं होता है। मुझे यह जांचना होगा कि कितने इकाइयों में बाल संग्रह होंगे और मुझे कितने काम करना होगा। एक और चीज जो मैं घूम रहा था वह था कि अगर इस परिस्थितियों में अपवाद फेंकना ठीक है। यह बुरा लगता है लेकिन अन्य विकल्प सुंदर नहीं हैं। IQueryable लपेटना वास्तव में दर्दनाक लगता है। ईमानदारी से मैं ओडाटा समाधान छोड़ दूंगा और ऐसा करने के बजाय किसी अन्य सेवा प्रकार के लिए जाऊंगा। – Stilgar