मैं वर्तमान में एनएसबीनेट एमवीसी प्रोजेक्ट का निर्माण कर रहा हूं, एनएचबेर्नेट के साथ इसकी दृढ़ता परत के रूप में।जानकारी छिपाने पर ध्यान केंद्रित करते समय, मैं अपने प्रोजेक्ट में एक मजबूत सत्र-प्रति-अनुरोध पैटर्न कैसे कार्यान्वित कर सकता हूं?
अभी के लिए, कुछ कार्यक्षमता लागू की गई है, लेकिन केवल स्थानीय एनएचबेर्नेट सत्रों का उपयोग करें: डेटाबेस (एक्सेस या लिखने) तक पहुंचने वाली प्रत्येक विधि को "उपयोग()" खंड के साथ अपने स्वयं के एनएचबीर्नेट सत्र को तुरंत चालू करने की आवश्यकता होती है।
समस्या यह है कि मैं अपनी परियोजना के प्रदर्शन में सुधार के लिए एनएचबीर्नेट की आलसी लोडिंग क्षमताओं का लाभ उठाना चाहता हूं।
यह दृश्य प्रतिपादित होने तक प्रति अनुरोध एक खुला NHibernate सत्र का तात्पर्य है। इसके अलावा, एक साथ अनुरोधों का समर्थन किया जाना चाहिए (एक ही समय में एकाधिक सत्र)।
मैं इसे यथासंभव स्वच्छ तरीके से कैसे प्राप्त कर सकता हूं?
मैंने वेब को थोड़ी सी खोज की और सत्र-प्रति-अनुरोध पैटर्न के बारे में सीखा। मैंने देखा कि अधिकांश कार्यान्वयन सत्र को स्टोर करने के लिए कुछ प्रकार के एचटीपी * (एचटीपी कॉन्टेक्स्ट, आदि) ऑब्जेक्ट का इस्तेमाल करते थे। साथ ही, Application_BeginRequest/Application_EndRequest फ़ंक्शंस का उपयोग जटिल है, क्योंकि प्रत्येक अनुरोध के बाद उन्हें प्रत्येक सत्र अनुरोध (एएसपीएक्स फाइल, सीएसएस फाइल, जेएस फाइल इत्यादि) के लिए निकाल दिया जाता है, जब मैं केवल अनुरोध के बाद एक सत्र को तुरंत चालू करना चाहता हूं।
मेरी चिंता यह है कि मैं नहीं चाहता कि मेरे विचार या नियंत्रक एनएचबीरनेट सत्र (या अधिक आम तौर पर, एनएचबेर्नेट नामस्थान और कोड) तक पहुंच प्राप्त करें। इसका मतलब है कि मैं नियंत्रक स्तर पर सत्रों को संभालना नहीं चाहता हूं और न ही दृश्य को देखना चाहता हूं।
मेरे पास कुछ विकल्प हैं। कौन सा सबसे अच्छा लगता है?
- इंटरसेप्टर (जैसे ग्रेल्स) का उपयोग करें जो नियंत्रक कार्रवाई से पहले और बाद में ट्रिगर हो जाते हैं। ये सत्र/लेनदेन खोलेंगे और बंद करेंगे। क्या यह एएसपी.नेट एमवीसी दुनिया में संभव है?
- वेब संदर्भ में NHibernate द्वारा प्रदत्त CurrentSessionContext सिंगलटन का उपयोग करें। एक उदाहरण के रूप में this page का उपयोग करना, मुझे लगता है कि यह काफी आशाजनक है, लेकिन अभी भी नियंत्रक स्तर पर फ़िल्टर की आवश्यकता है।
- अनुरोध सत्र को संग्रहीत करने के लिए HttpContext.Current.Items का उपयोग करें। यह Global.asax.cs में कोड की कुछ पंक्तियों के साथ मिलकर, अनुरोध स्तर पर आसानी से मुझे एक सत्र प्रदान कर सकता है। हालांकि, इसका मतलब है कि निर्भरता एनएचबीर्नेट और मेरे विचारों (एचटीपी कॉन्टेक्स्ट) के बीच इंजेक्शन दी जाएगी।
बहुत बहुत धन्यवाद!
"निर्भरता NHibernate और मेरे विचारों के बीच इंजेक्ट किया जाएगा" -> यह काफी स्पष्ट नहीं है कि आप इस के साथ क्या मतलब है, क्या आप आगे समझा सकते हैं? –
यदि मैं एनएचबीर्नेट सत्र को स्टोर करने के लिए HttpContext का उपयोग करता हूं, तो मेरे एमवीसी अनुप्रयोग का दृश्य पहलू डेटा एक्सेस पहलू (एनएचबीर्नेट सत्र) के साथ जोड़ा जाएगा। –
@ggervais: यह केवल तब होता है जब आप अपने विचारों में आलसी लोडिंग का उपयोग करते हैं, जो आपको नहीं करना चाहिए। –