में प्रति-अनुरोध निर्भरता रीसोलवर एमवीसी में, 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
जैसे कुछ भी नहीं मिला है जो इस ऑब्जेक्ट को एक लंबे समय तक जीवित वस्तु से एक्सेस प्रदान करेगा - अगर यह हासिल किया जा सकता है तो मुझे विश्वास है कि सब कुछ होगा सब सुलझ गया।
लगता है जैसे यह समाधान के करीब हो सकता है, लेकिन मैं HttpRequestMessage कैसे प्राप्त कर सकता हूं? यह एक लंबी दौड़ वाली कक्षा के भीतर से है। गुगलिंग से पता चलता है कि यह संभव नहीं है। – Richard