2010-01-12 15 views
11

मैं वर्तमान में एनएसबीनेट एमवीसी प्रोजेक्ट का निर्माण कर रहा हूं, एनएचबेर्नेट के साथ इसकी दृढ़ता परत के रूप में।जानकारी छिपाने पर ध्यान केंद्रित करते समय, मैं अपने प्रोजेक्ट में एक मजबूत सत्र-प्रति-अनुरोध पैटर्न कैसे कार्यान्वित कर सकता हूं?

अभी के लिए, कुछ कार्यक्षमता लागू की गई है, लेकिन केवल स्थानीय एनएचबेर्नेट सत्रों का उपयोग करें: डेटाबेस (एक्सेस या लिखने) तक पहुंचने वाली प्रत्येक विधि को "उपयोग()" खंड के साथ अपने स्वयं के एनएचबीर्नेट सत्र को तुरंत चालू करने की आवश्यकता होती है।

समस्या यह है कि मैं अपनी परियोजना के प्रदर्शन में सुधार के लिए एनएचबीर्नेट की आलसी लोडिंग क्षमताओं का लाभ उठाना चाहता हूं।

यह दृश्य प्रतिपादित होने तक प्रति अनुरोध एक खुला NHibernate सत्र का तात्पर्य है। इसके अलावा, एक साथ अनुरोधों का समर्थन किया जाना चाहिए (एक ही समय में एकाधिक सत्र)।

मैं इसे यथासंभव स्वच्छ तरीके से कैसे प्राप्त कर सकता हूं?

मैंने वेब को थोड़ी सी खोज की और सत्र-प्रति-अनुरोध पैटर्न के बारे में सीखा। मैंने देखा कि अधिकांश कार्यान्वयन सत्र को स्टोर करने के लिए कुछ प्रकार के एचटीपी * (एचटीपी कॉन्टेक्स्ट, आदि) ऑब्जेक्ट का इस्तेमाल करते थे। साथ ही, Application_BeginRequest/Application_EndRequest फ़ंक्शंस का उपयोग जटिल है, क्योंकि प्रत्येक अनुरोध के बाद उन्हें प्रत्येक सत्र अनुरोध (एएसपीएक्स फाइल, सीएसएस फाइल, जेएस फाइल इत्यादि) के लिए निकाल दिया जाता है, जब मैं केवल अनुरोध के बाद एक सत्र को तुरंत चालू करना चाहता हूं।

मेरी चिंता यह है कि मैं नहीं चाहता कि मेरे विचार या नियंत्रक एनएचबीरनेट सत्र (या अधिक आम तौर पर, एनएचबेर्नेट नामस्थान और कोड) तक पहुंच प्राप्त करें। इसका मतलब है कि मैं नियंत्रक स्तर पर सत्रों को संभालना नहीं चाहता हूं और न ही दृश्य को देखना चाहता हूं।

मेरे पास कुछ विकल्प हैं। कौन सा सबसे अच्छा लगता है?

  • इंटरसेप्टर (जैसे ग्रेल्स) का उपयोग करें जो नियंत्रक कार्रवाई से पहले और बाद में ट्रिगर हो जाते हैं। ये सत्र/लेनदेन खोलेंगे और बंद करेंगे। क्या यह एएसपी.नेट एमवीसी दुनिया में संभव है?
  • वेब संदर्भ में NHibernate द्वारा प्रदत्त CurrentSessionContext सिंगलटन का उपयोग करें। एक उदाहरण के रूप में this page का उपयोग करना, मुझे लगता है कि यह काफी आशाजनक है, लेकिन अभी भी नियंत्रक स्तर पर फ़िल्टर की आवश्यकता है।
  • अनुरोध सत्र को संग्रहीत करने के लिए HttpContext.Current.Items का उपयोग करें। यह Global.asax.cs में कोड की कुछ पंक्तियों के साथ मिलकर, अनुरोध स्तर पर आसानी से मुझे एक सत्र प्रदान कर सकता है। हालांकि, इसका मतलब है कि निर्भरता एनएचबीर्नेट और मेरे विचारों (एचटीपी कॉन्टेक्स्ट) के बीच इंजेक्शन दी जाएगी।

बहुत बहुत धन्यवाद!

+0

"निर्भरता NHibernate और मेरे विचारों के बीच इंजेक्ट किया जाएगा" -> यह काफी स्पष्ट नहीं है कि आप इस के साथ क्या मतलब है, क्या आप आगे समझा सकते हैं? –

+0

यदि मैं एनएचबीर्नेट सत्र को स्टोर करने के लिए HttpContext का उपयोग करता हूं, तो मेरे एमवीसी अनुप्रयोग का दृश्य पहलू डेटा एक्सेस पहलू (एनएचबीर्नेट सत्र) के साथ जोड़ा जाएगा। –

+0

@ggervais: यह केवल तब होता है जब आप अपने विचारों में आलसी लोडिंग का उपयोग करते हैं, जो आपको नहीं करना चाहिए। –

उत्तर

13

ठीक है दोस्तों, कुछ दिनों के काम के बाद, मैंने आखिरकार HttpContext.Current.Items का उपयोग सत्र को लोड करने का फैसला किया।

यह बहुत अच्छा काम करता है!

यहाँ कैसे मैं इसे

import System.Web 
class SessionManager { 
    public static ISession GetSession() 
     var session = HttpContext.Current.Items["NHibernateSession"]; 
     if (session == null) { 
      session = ...; // Create session, like SessionFactory.createSession()... 
      HttpContext.Current.Items.Add("NHibernateSession", session); 
     } 
     return session; 
    } 

    public static void CloseSession() 
    { 
     var session = HttpContext.Current.Items["NHibernateSession"]; 
     if (session != null) { 
      if (session.IsOpen) { 
       session.close(); 
      } 
      HttpContext.Current.Items.Remove("NHibernateSession"); 
     } 
    } 
} 

किया है इस वर्ग द्वारा प्रदान की स्थिर तरीकों का उपयोग करके, एक एक सत्र (उदाहरण के लिए एक नियंत्रक में,) प्राप्त कर सकते हैं वर्तमान HttpContext से जुड़ा हुआ है कि (वर्तमान वेब अनुरोध)। जब अनुरोध पूरा हो जाता है तो हमें CloseSession() विधि को कॉल करने के लिए कोड का एक और स्निपेट चाहिए।

Global.asax.cs में:

protected void Application_EndRequest(object sender, EventArgs args) 
{ 
    NHibernateSessionManager.CloseSession(); 
} 

जब सत्र पूरा हो गया है Application_EndRequest घटना स्वचालित रूप से कहा जाता है, तो सत्र ठीक से एक का निपटारा बंद किया जा सकता। यह उपयोगी है, क्योंकि अन्यथा हमें हर नियंत्रक में ऐसा करना होगा!

+1

क्या आप इसे विस्तारित करने के तरीके को समझने की कोशिश कर रहे हैं, तो कृपया अधिक जानकारी दे सकते हैं? –

+0

@ जो-फिलिप्स: मेरा संपादन देखें, मैंने इसे समझाया! –

+0

मुझे लगता है कि यह यूनिट परीक्षण करते समय समस्याएं पैदा कर सकता है, इसकी देखभाल करने की आवश्यकता है। मैं इस लिंक पर आया http://www.prideparrot.com/blog/archive/2012/7/how_to_create_a_custom_session_value_provider जो जाने के लिए अच्छा विकल्प हो सकता है। कोई इनपुट अच्छा होगा? –

1

S#arp Architecture पर एक नज़र डालें। यह एएसपी.नेट एमवीसी और एनएचबेर्नेट के लिए एक बहुत अच्छा वास्तुकला है।

2

उपयोग डि एक आईओसी के साथ: (। यह क्रिया या नियंत्रक स्तर पर किया जा सकता है) यहाँ यह का एक उदाहरण है। अधिकांश आईओसी प्रति अनुरोध तत्काल व्यवहार के साथ आते हैं।