8

मैं एक Context Per Request पैटर्न बनाने के लिए EF code first, MVC और StructureMap की एक ट्यूटोरियल में नीचे के रूप में एक कोड देखा:स्ट्रक्चर मैप HttpContextScoped आवश्यक है?

protected void Application_Start() 
    { 
     ... 

     initStructureMap(); 

    } 

    private static void initStructureMap() 
    { 

     ObjectFactory.Initialize(x => 
     { 
      x.For<IUnitOfWork>().HttpContextScoped().Use(() => new Context()); 
      x.For<IFirstEntity>().Use<FirstEntity>(); 
      x.For<ISecondEntity>().Use<SecondEntity>(); 
      x.For<IThirdEntity>().Use<ThirdEntity>(); 
     }); 

     ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
    } 

    protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
    } 


public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     return ObjectFactory.GetInstance(controllerType) as Controller; 
    } 
} 

FirstEntity, SecondEntity और ... सब अपने निर्माता में IunitOfWork की जरूरत है।

आप यह सिर्फ Context नहीं दूसरों के लिए और EndRequest घटना यह कहता है ReleaseAndDisposeAllHttpScopedObjects() में HttpContextScoped() का उपयोग करता है के रूप में देख सकते हैं।

1- क्या यह एक सही दृष्टिकोण है?

2- क्या मैं अन्य सभी Service layer Interfaces के लिए HttpContextScoped() का उपयोग करूंगा या न केवल IUnitOfWork के लिए? उदाहरण के लिए:

x.For<IFirstEntity>().Use<FirstEntity>(); 

या

x.For<IFirstEntity>().HttpContextScoped().Use(() => new FirstEntity()); 

3- ReleaseAndDisposeAllHttpScopedObjects() सभी उदाहरणों disposes या सिर्फ Context disposes?

उत्तर

8

वेब अनुप्रयोगों के लिए सम्मेलन यह है कि आप संपूर्ण http अनुरोध के दौरान एक ही ORM संदर्भ/UnitOfWork रखते हैं। अनुरोध के दौरान एक ही संस्था के साथ काम करने के लिए, डेटा को सुसंगत बनाए रखें और डेटाबेस कॉल को कम करें। HttpContextScoped जीवन चक्र यह सुनिश्चित करता है कि उसी यूओडब्ल्यू इंस्टेंस का उपयोग उन सभी मामलों के अनुरोध के दौरान किया जाता है जिन पर निर्भरता है।

तो 1) हाँ, यह सही

"सेवा परत इंटरफेस" के बाकी के बारे में है, यह है कि क्या यह पूरे अनुरोध के दौरान एक ही उदाहरण की जरूरत पर निर्भर करता है। अपने आप से पूछें: "पूरे अनुरोध के दौरान इस वस्तु की स्थिति की आवश्यकता होगी"? अधिकांश "सेवाओं" के लिए यह मामला नहीं है। यह भी ध्यान रखें कि कुछ "HttpContextScoped" बनाने से यह सभी निर्भरताएं उस दायरे के दौरान भी रहेंगी।

यह 2) ज्यादातर मामलों में कहते हैं की ओर जाता है मुझे, कोई

ReleaseAndDisposeAllHttpScopedObjectsHttpContextScoped के साथ पंजीकृत कंटेनर में सभी वस्तुओं disposes। डिफ़ॉल्ट ऑब्जेक्ट्स द्वारा स्ट्रक्चरमैप में क्षणिक (प्रति उदाहरण नया उदाहरण) के रूप में स्कॉप्ड किया जाता है।

तो 3) बस IUnitOfWork उदाहरण का निपटारा किया जाएगा।

+0

मैंने प्रश्न 2 –

+0

अद्यतन किया गया अद्यतन अद्यतन किया। जब तक आपको एक ही स्थिति को रखने की आवश्यकता न हो या उदाहरण के दौरान राज्य को बनाने के लिए महंगा हो और राज्य को साझा कर सकें, तो क्षणिक वस्तुओं के साथ जाएं। – PHeiberg

+0

धन्यवाद, मेरी समस्या तब होती है जब इन उदाहरणों का निपटारा किया जाएगा? क्या वे EndRequest में भी निपटान करते हैं या नहीं? –

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