6

मैं एक बालों वाली समस्या में भाग गया है। शायद इसके लिए एक आसान समाधान है लेकिन मुझे यह नहीं मिल रहा है!एचटीपीएचंडलर में आईओसी का उपयोग कर कंस्ट्रक्टर/सेटर इंजेक्शन, क्या यह संभव है?

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

तो मेरे पास दो इंटरफेस हैं; एक डेटा प्रविष्टि के लिए दूसरे को लॉगिंग करने के लिए, जो कि इंजेक्शन इंजेक्शन हैं। मुझे जल्दी पता चला कि कन्स्ट्रक्टर को कॉल करने का कोई तरीका नहीं है क्योंकि डिफ़ॉल्ट पैरामीटर रहित कन्स्ट्रक्टर हमेशा इसके बजाय बुलाया जाता है।

तो मैंने सोचा कि मैं सेटर इंजेक्शन का उपयोग करूंगा और कैसल विंडसर को सॉर्ट कर दूंगा। यह वास्तव में काम करता है जब मैं container.Resolve<CustomHttpHandler>(); का उपयोग करता हूं, मैं जांच सकता हूं कि लॉगर शून्य नहीं है। (Global.asax.cs में Application_Start में)

समस्या यह है कि कैसल विंडसर उदाहरण बना सकता है कि http अनुप्रयोग इसका उपयोग नहीं कर रहा है ??? मुझे लगता है??

असल में ऐसा करने का पूरा कारण यह है कि मैकिंग और यूनिट परीक्षण के माध्यम से अलगाव में लॉगर और डेटा रिपोजिटरी कोड का परीक्षण करने में सक्षम होना था।

कोई समस्या है कि मैं इस समस्या को हल करने के बारे में कैसे जा सकता हूं?

धन्यवाद!

+0

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

+0

हाय मॉरिसियो। क्षमा करें, जाहिर है मैं यह कैसे काम करता हूं यह नया है। वापस आ गया है और एक नया सवाल बनाया है। धन्यवाद! – Matt

उत्तर

2

संभव नहीं,: तो अपने HttpHandler के ProcessRequest विधि में आप कुछ इस तरह करना होगा। IHttpHandler ऑब्जेक्ट्स को एएसपी.NET रनटाइम द्वारा तत्काल किया जाता है और यह विंडसर को इसके निर्माण में शामिल होने की अनुमति नहीं देता है। आप या तो:

  • कंटेनर को सेवा लोकेटर के रूप में उपयोग करके निर्भरता खींचें।
  • एक आधार हैंडलर कि बनाता है, लगाता है और अपने स्वयं के प्रतिनिधियों संचालकों को सेट करें (देखें कैसे Spring does it)
  • उपयोग किसी अन्य सेवा है कि पूरे अनुरोध हैंडल के लिए एक सेवा के रूप में लोकेटर कंटेनर (saret explained के रूप में)
+0

डांग, मुझे लगा कि यह मामला हो सकता है। क्या आप अपना पहला बिंदु समझा सकते हैं: कंटेनर को सेवा लोकेटर के रूप में उपयोग करके निर्भरता खींचें। धन्यवाद! – Matt

+0

@ मैट: अपने एचटीपी हैंडलर से, कंटेनर को जो भी निर्भरता आपको प्राप्त करने के लिए बुलाएं। –

+0

उत्तर मॉरीसिओ के लिए धन्यवाद। समझ लिया! – Matt

2

आप क्या कर सकते हैं HttpHandler किसी अन्य ऑब्जेक्ट पर कॉल करता है जो वास्तव में अनुरोध को संभालता है। कम से कम नहीं सीधे

public void ProcessRequest(HttpContext context) 
{ 
var myHandlerObject = container.Resolve<HandlerObject>(); 
myHandlerObject.ProcessRequest(context or some state/info that is required) 
} 
+0

हाय। विचार के लिए धन्यवाद। यह समाधान हो सकता है, मॉरीसिओ के अन्य विकल्पों में से एक। धन्यवाद! – Matt