2013-02-22 20 views
8

में प्रति-अनुरोध निर्भरता रीसोलवर एमवीसी में, ModelValidatorProvider तत्काल है और प्रत्येक अनुरोध पर एक मॉडल को सत्यापित करने के लिए बुलाया जाता है। इसका मतलब है कि एक डीआई पर्यावरण में, यह एक अनुरोध के भीतर स्कॉप्ड ऑब्जेक्ट्स पर निर्भरता ले सकता है, जैसे कार्य इकाई या डेटाबेस संदर्भ। वेब एपीआई में, ऐसा लगता है कि यह काफी बदल गया है। प्रति-अनुरोध तत्काल होने के बजाय, ModelValidatorProvider लंबे समय तक रहता है और एप्लिकेशन स्टार्टअप के भीतर तत्काल होता है। वेबएपीआई ModelValidatorProvider प्रति-प्रकार के परिणामों को कैश करता है, जिसका अर्थ है कि ModelValidator DI से कोई निर्भरता नहीं ले सकता है।वेब-एपीआई

मैं सेवा लोकेटर (कृपया, कोई स्वचालित 'विरोधी-पैटर्न' टिप्पणियों का उपयोग करके फैक्टरी का उपयोग करने के लिए अपने ModelValidator को लागू करने का प्रयास कर रहा हूं। यह मुझे प्रत्येक अनुरोध के भीतर एक आंतरिक सत्यापनकर्ता वस्तु बनाने की अनुमति देगा, जो कंटेनर से निर्भरता लेने में सक्षम होगा। हालांकि, मैं इस ModelValidator के भीतर से वर्तमान अनुरोध पर निर्भर निर्भरता रिजॉल्वर या कंटेनर धारण नहीं कर सकता जो अनिवार्य रूप से सिंगलटन के रूप में स्कॉप्ड होता है। मैं GlobalConfiguration.Configuration.DependencyResolver उपयोग करने के लिए कोशिश की है, लेकिन यह केवल रिटर्न विश्व स्तर पर-दायरे वाले सेवाओं (रूट दायरे से, यह भी mentioned here)

मैं Autofac में काम कर रहा हूँ, इसलिए एक autofac विशेष समाधान उपयुक्त होगा (जैसे MVC AutofacDependencyResolver.Current है , जो आंतरिक रूप से DependencyResolver.GetService का उपयोग करता है)। वेबएपीआई एकीकरण में कोई समकक्ष उपलब्ध नहीं है, संभवतः ऊपर उल्लिखित कारणों के कारण जहां वैश्विक DependencyResolver केवल विश्व स्तर पर स्कॉप्ड सेवाओं को लौटाता है।

कारण मैं इसे करने का प्रयास कर रहा हूं (साथ ही साथ अपने स्वयं के उपयोग के लिए) FluentValidation के लिए वेब एपीआई एकीकरण को कार्यान्वित करना है, जो वर्तमान में मौजूद नहीं है। अभी तक दो प्रयास हुए हैं, लेकिन इनमें से कोई भी निर्भरता इंजेक्शन समस्या को संभालता है और इसके परिणामस्वरूप एक स्थिर मॉडल वैलिडेटर होता है।

चीजें मैं अब तक की कोशिश की है:

  • GlobalConfiguration.Configuration.DependencyResolver
  • Func<IComponentContext> (हमेशा जड़ संदर्भ देता है)

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

फिलिप डब्ल्यू का जवाब निर्भरता स्कोप प्राप्त करने के लिए HttpRequestMessage का उपयोग करने का सुझाव देता है, लेकिन मुझे HttpRequestMessage.Current जैसे कुछ भी नहीं मिला है जो इस ऑब्जेक्ट को एक लंबे समय तक जीवित वस्तु से एक्सेस प्रदान करेगा - अगर यह हासिल किया जा सकता है तो मुझे विश्वास है कि सब कुछ होगा सब सुलझ गया।

उत्तर

3

वर्तमान निर्भरता गुंजाइश पाने के लिए आपको उपयोग करने के लिए आश्चर्य की बात है, आश्चर्य की बात है :) वर्तमान HttpRequestMessage की GetDependencyScope() (अधिक जिसके बारे में आप GlobalConfiguration के बजाय on MSDN अप पढ़ सकते हैं) है (।

मैंने कुछ समय पहले Web API per-request dependency scope ब्लॉग किया - यह सहायक होना चाहिए।

+6

लगता है जैसे यह समाधान के करीब हो सकता है, लेकिन मैं HttpRequestMessage कैसे प्राप्त कर सकता हूं? यह एक लंबी दौड़ वाली कक्षा के भीतर से है। गुगलिंग से पता चलता है कि यह संभव नहीं है। – Richard

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