2008-12-02 14 views
5

में 'सेवा' में वेब संदर्भ पास करना मैं एक सेवा वर्ग (या इसके संदर्भ में कक्षा को आरंभ करने) में वेब वर्तमान http संदर्भ को पारित करने का एक तरीका तैयार करने का प्रयास कर रहा हूं। मैं इसे http संदर्भ के बारे में कुछ भी जानने की आवश्यकता से दूर बाकी ऐप को अमूर्त करने के लिए कर रहा हूं।एएसपी एमवीसी ऐप

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

मैं प्राप्त करना चाहते हैं का एक उदाहरण:

class WebInstanceService 
{ 
    private IHttpContext _Context;   

    public WebInstanceService(... , IHttpContext HttpContext) 
    { 
     .... 
     _Context = HttpContext; 
    } 

    // Methods... 
    public string GetInstanceVariable(string VariableName) 
    { 
     return _Context.Current.Session[VariableName]; 
    } 
} 

मुख्य मुद्दों मेरे पास है में से एक नहीं IHttpContext, .net http संदर्भ एक अमूर्त वर्ग का एक उपवर्ग है है कि वहाँ है जो कर सकते हैं मजाक नहीं किया जा सकता है (आसानी से?)।

एक और मुद्दा यह है कि मैं कक्षा के वैश्विक उदाहरण शुरू नहीं कर सकता क्योंकि तब संदर्भ अधिकांश अनुरोधों के लिए प्रासंगिक नहीं होगा।

मैं कक्षा स्थिर कर सकता है, और प्रसंग की आवश्यकता होती है प्रत्येक कार्य को पास करने की के रूप में यह यानी

public static string GetInstanceVariable(string VariableName, HttpContext Context) 
{ ... } 

कहा जाता है लेकिन इस वर्ग नहीं है किसी भी आसान परीक्षण करने के लिए, मैं अभी भी करने की जरूरत है एक HttpContext बनाएं और इसके अतिरिक्त किसी भी गैर-वेब-जागरूक सेवाओं को जो इस कक्षा का उपयोग करना चाहते हैं, अचानक उन संदर्भों को पुनर्प्राप्त करने में सक्षम होना चाहिए जिन्हें उन्हें वेब सर्वर के साथ मिलकर जोड़ा जाना चाहिए - इस वर्ग को पहले में बनाना चाहते हैं जगह।

मैं सभी सुझावों के लिए खुला हूं - खासकर जो लोग जानते हैं कि आसानी से आसान परीक्षण की सुविधा है। लोग इस समस्या से निपटने का सुझाव कैसे देंगे?

चीयर्स

उत्तर

3

यही कारण है कि HttpContextBase और HttpContextWrapper पेश किए गए है। आप शायद HttpContextBase का उपयोग करना चाहते हैं और वास्तविक संदर्भ को पार करते समय, new HttpContextWrapper(httpContext) का उपयोग करें, हालांकि, मुझे लगता है कि नियंत्रक में आपके लिए जो उपलब्ध है वह पहले से ही HttpContextBase प्रकार है। मैं स्थिर, वैश्विक HttpContext.Current उदाहरण से वर्तमान संदर्भ को संदर्भित करने की कोशिश करने के बजाय हर बार अपने नियंत्रक में इनमें से एक बनाऊंगा। यदि आपको अपने विचार में इसकी आवश्यकता है, तो ViewData में अपने दृढ़ टाइप किए गए संदर्भ का संदर्भ दें।

मैं अपने परीक्षणों में अक्सर HttpContextBase का नकल करता हूं।

class WebInstanceService 
{ 
    private HttpContextBase _Context;   

    public WebInstanceService(... , HttpContextBase HttpContext) 
    { 
     .... 
     _Context = HttpContext; 
    } 

    // Methods... 
    public string GetInstanceVariable(string VariableName) 
    { 
     return _Context.Session[VariableName]; 
    } 
} 
1

हम क्या करते हैं, पाई के रूप में इन ऊपर http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx

आसान की स्पिन से एक है सिर्फ एक HttpSimulator instanciate और मान भरें, और HttpContext.Current जो कुछ भी आपके द्वारा निर्दिष्ट से भर जाता है।

IHttpContext कुछ ऐसा है जो एमवीसी में है, और स्पष्ट रूप से एक दिन वेबफॉर्म में होगा। उम्मीद है कि वह दिन होगा .नेट 4

1

एएसपी.नेट सिस्टम.Web.Abstractions के साथ आता है जिसमें HttpContextBase शामिल है जिसका उपयोग आप परीक्षण स्थिति में HttpContext से निपटने के लिए कर सकते हैं।

मैं व्यक्तिगत रूप से HttpContext पर प्रत्यक्ष निर्भरता को दूर कर दूंगा।

+0

यह वही है जो मैं करने की कोशिश कर रहा हूं, मैं नहीं चाहता कि मेरे ऐप में सेवाओं को डेटा पुनर्प्राप्त करने के लिए सत्र तक पहुंचने के बारे में चिंता करने की ज़रूरत है, तो मैं वेबस्टेंस सेवा कक्षा के माध्यम से जाऊंगा। – Ash

+0

मैं भी WebInstanceService पर सवाल उठाऊंगा। क्या सेवा को वेब से यह जानने की ज़रूरत है? –

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