30

MVC 3 + एफई 4.1एमवीसी में डीबीकॉन्टेक्स्ट को तत्काल और निपटाने का सबसे अच्छा तरीका क्या है?

मैं दो दृष्टिकोण DbContext से निपटने के लिए के बीच चुनने हूँ: Application_BeginRequest में

  1. का दृष्टांत, यह HttpContext.Current.Items में डाल दिया और Application_EndRequest में निपटाने।
  2. (DbContext के लिए kindof आवरण) डिस्पोजेबल UnitOfWork बनाएँ और using(var unitOfWork = new UnitOfWork()) { ... }

के साथ प्रत्येक नियंत्रक कार्रवाई शुरू अपना अनुभव साझा करें: आप कौन-सी पसंद करेंगे? प्रत्येक दृष्टिकोण के लिए पेशेवर और विपक्ष क्या हैं?

+0

ब्लॉक दृष्टिकोण का उपयोग करने से कुछ नुकसान हो रहे हैं। यह डेटाबेस के लिए कई दौर यात्रा और इकाई ढांचे में लेनदेन का दुरुपयोग का कारण बनता है। http://ayende.com/blog/4775/new-profiler-feature-avoid-writes-from-multiple-sessions-in-the-same-request – marvelTracker

+0

क्यों अधिक राउंडट्रिप्स का कारण बनता है?एक http अनुरोध को अधिकांश मामलों में एक कार्रवाई चलाने की आवश्यकता होती है, इसलिए यदि आप ब्लॉक का उपयोग करके इस क्रिया में पूरे क्रिया का कोड लपेटते हैं तो पहले दृष्टिकोण की तुलना में अधिक डेटाबेस अनुरोध नहीं होंगे। 'प्रति क्रिया' दृष्टिकोण के साथ दूसरी बात यह है कि आपको हमेशा उस क्षेत्र के बारे में पता होना चाहिए जिसे डेटाबेस में शामिल किया जा सकता है और ब्लॉक को उचित रूप से रखा जा सकता है। उदाहरण के लिए यदि आपके मॉडल में कुछ समय में आलसी लोड होने के लिए कुछ संग्रह शामिल हैं, तो प्रतिपादन देखें, कथन लौटने वाला व्यू (मॉडल) ब्लॉक के अंदर होना चाहिए। – YMC

+0

यदि आप यूनिटऑफवर्क के साथ नियंत्रक परत रैप में डीबीकॉन्टेक्स्ट का उपयोग करते हैं तो यूआई परत और आपके डेटाबेस दृष्टिकोण में मजबूत निर्भरता पैदा होती है। फिर आपको एक सेवा परत और रिपोजिटरी परत की आवश्यकता है। इसके बाद यदि आपके रिपॉजिटरीज़ में यूनिटऑफवर्क अलग-अलग ब्लॉक हैं जो ब्लॉक का उपयोग करते हैं जो एक समस्या होगी। क्योंकि प्रत्येक और प्रत्येक भंडार लेनदेन और अनावश्यक डेटाबेस दौर यात्रा बनाता है। अधिक जानकारी के लिए उपरोक्त लिंक देखें। यदि आप प्रति अनुरोध एक सेवा कॉल के बारे में निश्चित हैं तो आप सेवा विधि के अंदर यूनिटफवर्क का उपयोग कर सकते हैं। हालांकि, यह गारंटी नहीं है। – marvelTracker

उत्तर

18

मैं तुम्हें एक निर्भरता इंजेक्शन ढांचे का उपयोग सुझाव है। आप अनुरोध

container.RegisterType<MyDbContext>().InstancePerHttpRequest(); 

के अनुसार आपके DbContext रजिस्टर और नियंत्रक करने के लिए एक निर्माता पैरामीटर के रूप में यह इंजेक्षन कर सकते हैं।

public class MyController : Controller 
{ 
    public MyController(MyDbContext myDbContext) 
    { 
     _myDbContext = myDbContext; 
    } 
} 

जब अनुरोध समाप्त होता पंजीकृत प्रकार लागू करता है तो IDisposable तो डि ढांचे यह निपटाने होंगे।

पहला दृष्टिकोण: मैन्युअल रूप से इसे लागू करने से आईडी फ्रेमवर्क का उपयोग करना अधिक स्वच्छ है। इसके अलावा आपके सभी अनुरोधों को आपके यूओडब्ल्यू की आवश्यकता नहीं हो सकती है।

दूसरा दृष्टिकोण: नियंत्रक को यह नहीं पता होना चाहिए कि आपके यूओडब्ल्यू (डीबीकॉन्टेक्स्ट) को कैसे बनाया जाए। उद्देश्य घटकों के बीच युग्मन को कम नहीं करता है।

+0

ठीक है, ICC कंटेनर को BeginRequset और EndRequest को संभालने से बेहतर है, लेकिन यह अभी भी मुझे नंबर 1 के करीब दिखता है, इसलिए मैंने इसे अलग दृष्टिकोण के रूप में भी निकाला नहीं है। मेरे लिए और अधिक महत्वपूर्ण है कि डीबीकॉन्टेक्स्ट (= कार्य की इकाई) के जीवन चक्र तक पहुंचने और नियंत्रित करने के 2 तरीकों की तुलना करना: पहला तरीका यह है कि एएसपी.नेट/आईओसी बुनियादी ढांचा इसके लिए ज़िम्मेदार है, दूसरा एक नियंत्रक कार्रवाई के बारे में है चार्ज। – YMC

+0

@YMC संपादित उत्तर। आपका दूसरा दृष्टिकोण आपके नियंत्रक और यूओडब्ल्यू कार्यान्वयन के बीच युग्मन शुरू करेगा। मेरा सुझाव है कि आप इससे बचें। – Eranga

+3

सेवा परत का परिचय दें और नियंत्रक को सेवाओं को इंजेक्ट करें। सेवा में कई रिपॉजिटरीज और रिपॉजिटरीज EFDbContext के साथ UnitOfWork wrap पर निर्भर हो सकती हैं। फिर उन निर्भरताओं को इंजेक्ट करने के लिए DI का उपयोग करें। फिर आप चिंता के पृथक्करण का लाभ प्राप्त कर सकते हैं। – marvelTracker

-1

वैश्विक.एक्सएक्स में डीबीकॉन्टेक्स्ट डालें मत! :

  1. Static field of DbContext in Global.asax versus instance field of DbContext in controller class?
  2. Entity framework context as static
+2

ओपी ने एक स्थिर क्षेत्र में डीबीकॉन्टेक्स्ट डालने के बारे में कुछ भी नहीं कहा ... वह इसे HttpContext.Current.Items में रखना चाहता है, जहां तक ​​मैं –

+0

देख सकता हूं, मैंने यह नहीं कहा कि मैंने डीबीकॉन्टेक्स्ट को वैश्विक.एक्सएक्स में रखा है । मैंने कहा कि मैंने कोड डाला है जो डीबीकॉन्टेक्स्ट को तत्काल और डिस्पोजेक्ट करता है। DbContext HttpContext.Current.Items में है। यह धागा-सुरक्षित है। – YMC

2

हम वर्तमान में एक भंडार कारखाने से सेवा लोकेटर के माध्यम से यूओडब्ल्यू (काम की इकाई) के साथ इंजेक्शन वाले रिपॉजिटरीज का उपयोग करते हैं। एकता जीवन भर को इस तरह से काम से दूर ले जाती है।

आपका विशेष कार्यान्वयन अगर आपके का उपयोग कर POCO का, इकाई वस्तुओं, आदि के आधार पर भिन्न होगा ..

अंतत: आप UOW चाहते हैं कि आपके अपने नियंत्रक में एक से अधिक objectset के साथ काम करने को सुनिश्चित करने के लिए जा अगर आपके सिर्फ एक संदर्भ का उपयोग करते हुए । यह आपके लेनदेन को चेक आदि में रखेगा।

यदि आप एकाधिक ऑब्जेक्ट कॉन्टेक्स (यानी एकाधिक ईडीएमएक्स) का उपयोग करने जा रहे हैं, तो आप एमएसडीटीसी के साथ यूओडब्लू का उपयोग करना चाहेंगे ... लेकिन शायद आप जानना चाहते हैं । अंत में, यह सुनिश्चित करना महत्वपूर्ण है कि आप केवल नियंत्रक कार्रवाई के लिए आवश्यक चीज़ों को तुरंत चालू करें (यानी संदर्भ का एक उदाहरण।)। मुझे नहीं लगता कि मैं Begin_Request के साथ जाऊंगा, आपको हर अनुरोध के संदर्भ की आवश्यकता भी नहीं हो सकती है।

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

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