मैं बस इसी सटीक समस्या में भाग गया, लेकिन मेरा समाधान कुछ अलग है।
इंटरफ़ेस:
public interface IHttpContextProvider
{
/// <summary>
/// Gets the current HTTP context.
/// </summary>
/// <value>The current HTTP context.</value>
HttpContextBase Current { get; }
}
कार्यान्वयन:
/// <summary>
/// A default HTTP context provider, returning a <see cref="HttpContextWrapper"/> from <see cref="HttpContext.Current"/>.
/// </summary>
public class DefaultHttpContextProvider : IHttpContextProvider
{
public HttpContextBase Current
{
get { return new HttpContextWrapper(HttpContext.Current); }
}
}
मैं तो रजिस्टर कंटेनर में एक सिंगलटन के रूप में IHttpContextProvider
। जब मैं DI की बात करता हूं, तब भी मैं नौसिखिया का थोड़ा सा हूं, इसलिए शायद मैं जटिल चीजों से अधिक हूं, लेकिन जो मैं समझ सकता हूं, उससे कोई भी सिंगलटन घटक PerWebRequest लाइफस्टाइल घटकों पर निर्भर नहीं हो सकता है, जो समझ में आता है (लेकिन यही सब उदाहरण हैं)। मेरे समाधान में, मैं एक पृथक घटक में HttpContext.Current
पर निर्भर करता हूं और मुझे इसका परीक्षण करने में कोई दिलचस्पी नहीं है। लेकिन प्रत्येक घटक जिसे HTTP संदर्भ तक पहुंच की आवश्यकता है, वह IHttpContextProvider
के आधार पर प्राप्त कर सकता है और आवश्यकतानुसार आसानी से नकल कर सकता है।
क्या मैं वास्तव में जटिल चीजों से अधिक हूं या क्या मेरे समाधान में कोई चेतावनी है?
मार्क, जानकारी के लिए धन्यवाद - मुझे PerWebRequest के बारे में पता नहीं था। मैं इसे देख लूँगा। –
मार्क, मैंने PerWebRequest में देखा है, लेकिन मुझे अभी भी नहीं पता है कि सेवाएं HttpContext कैसे प्राप्त कर सकती हैं। जब मैं स्वयं को कंटेनर में HttpContextBase का उदाहरण पंजीकृत करने का प्रयास करता हूं, तो यह दूसरे अनुरोध के बाद विफल रहता है (चूंकि एक उदाहरण पिछले अनुरोध में पहले ही पंजीकृत था)। मुझे अब तक Google पर कुछ भी नहीं मिला ... –
मैंने गलत समझा होगा कि आप क्या करने का प्रयास कर रहे हैं, लेकिन आप एप्लिकेशन_स्टार्ट से HttpContext का उपयोग नहीं कर सकते हैं क्योंकि इस बिंदु पर * है * कोई HttpContext (PerWebRequest या कोई PerWebRequest नहीं है)। अब जब मैं इसके बारे में सोचता हूं, तो डी कंटेनर से HttpContext के जीवनकाल को नियंत्रित करने का प्रयास करने का कोई मतलब नहीं है, क्योंकि यह जीवनकाल पहले से ही एएसपी.नेट एमवीसी ढांचे द्वारा प्रबंधित किया जा रहा है।आप * क्या कर सकते हैं एक कस्टम आईसींट्रोलर फैक्ट्री में हुक करना और उस बिंदु पर आपके द्वारा प्रदान की गई HttpContext को पकड़ना है, और फिर उस पर निर्भर करता है कि बाकी सब कुछ तार करने के लिए एक कारखाने विधि का उपयोग करें। –