2011-05-02 12 views
5

किसी वेब एप्लिकेशन के लिए, यह सत्र को संभालने का एक अच्छा तरीका है, सेटिंग <property name="current_session_context_class">managed_web</property> सेटिंग का उपयोग करना है, आरंभ/EndRequest पर CurrentSessionContext.Bind/Unbind पर कॉल करें। तो मैं भंडार वर्ग में sessionFactory.GetCurrentSession() का उपयोग कर सकता हूं।पृष्ठभूमि-श्रमिकों के साथ वेब अनुप्रयोग के लिए सत्र प्रबंधन रणनीति को रोकें?

यह सभी पृष्ठ अनुरोध के लिए ठीक काम करता है। लेकिन मेरे पास पृष्ठभूमि कार्यकर्ता सामान कर रहे हैं और सामान करने के लिए एक ही भंडार वर्गों का उपयोग कर रहे हैं। ये वेब अनुरोध के भीतर नहीं चलते हैं, ताकि सत्र प्रबंधन काम नहीं करेगा।

कोई सुझाव कैसे हल किया जा सकता है?

उत्तर

14

मैं अपने खुद के सत्र संदर्भ वर्ग बनाने के द्वारा इसे हल:

public class HybridWebSessionContext : CurrentSessionContext 
{ 
    private const string _itemsKey = "HybridWebSessionContext"; 
    [ThreadStatic] private static ISession _threadSession; 

    // This constructor should be kept, otherwise NHibernate will fail to create an instance of this class. 
    public HybridWebSessionContext(ISessionFactoryImplementor factory) 
    { 
    } 

    protected override ISession Session 
    { 
     get 
     { 
      var currentContext = ReflectiveHttpContext.HttpContextCurrentGetter(); 
      if (currentContext != null) 
      { 
       var items = ReflectiveHttpContext.HttpContextItemsGetter(currentContext); 
       var session = items[_itemsKey] as ISession; 
       if (session != null) 
       { 
        return session; 
       } 
      } 

      return _threadSession; 
     } 
     set 
     { 
      var currentContext = ReflectiveHttpContext.HttpContextCurrentGetter(); 
      if (currentContext != null) 
      { 
       var items = ReflectiveHttpContext.HttpContextItemsGetter(currentContext); 
       items[_itemsKey] = value; 
       return; 
      } 

      _threadSession = value; 
     } 
    } 
} 
+6

यदि आप 'HttpContext.Current' को संदर्भित नहीं करना चाहते हैं, तो आप यह निर्धारित करने के लिए कि कोई संदर्भ उपलब्ध है या नहीं, आप 'NHibernate.Context.ReflectiveHttpContext' का उपयोग कर सकते हैं। यह उन परिस्थितियों में उपयोगी है जहां आप उदाहरण के लिए डेटा एक्सेस प्रोजेक्ट में 'System.Web' का संदर्भ नहीं देना चाहते हैं। – Siewers

+1

धन्यवाद, अच्छी टिप! मैंने इसके बजाय कोड का उपयोग करने के लिए संपादित किया है! :) – Allrameest

+1

बहुत बहुत धन्यवाद! आधा दिन इस पर परेशान हो रहा है - मेरे पास एक डब्ल्यूसीएफ सेवा के साथ एक वेबफॉर्म प्रोजेक्ट है, और 'CurrentSessionContext.Bind'' NullReferenceException' फेंक रहा था। आपका कोड मेरे लिए बेकार ढंग से काम करता है: डी –

0

मेरी परियोजना पर, मैंने CurrentSessionContext के आस-पास एक छोटी रैपर कक्षा लिखी।
शायद आप इसे अपनी आवश्यकताओं के अनुरूप बढ़ा सकते हैं।
मैं तुम सिर्फ BindSessionToRequest और GetCurrentSession के कार्यान्वयन बदलाव करने की जरूरत है: (

public static class SessionManager 
    { 
     private static ISessionFactory _sessionFactory = null; 
     private static ISessionFactory SessionFactory 
     { 
      get 
      { 
       if (_sessionFactory == null) 
       { 
        //check whether we're in web context or win context, and create the session factory accordingly. 
        if (System.Web.HttpContext.Current != null) 
        { 
         if (_sessionFactory == null) 
         { 
          _sessionFactory = DAOBase.GetSessionFactory(); 
         } 
        } 
        else 
        { 
         _sessionFactory = DAOBase.GetSessionFactoryForWin(); 
        } 
       } 
       return _sessionFactory; 
      } 
     } 

     public static void BindSessionToRequest() 
     { 
      ISession session = SessionManager.SessionFactory.OpenSession(); 
      NHibernate.Context.CurrentSessionContext.Bind(session); 
     } 

     public static bool CurrentSessionExists() 
     { 
      return NHibernate.Context.CurrentSessionContext.HasBind(SessionFactory); 
     } 

     public static void UnbindSession() 
     { 
      ISession session = NHibernate.Context.CurrentSessionContext.Unbind(SessionManager.SessionFactory); 
      if (session != null && session.IsOpen) 
      { 
       session.Close(); 
      } 
     } 

     public static ISession GetCurrentSession() 
     { 
      return SessionFactory.GetCurrentSession(); 
     } 
    } 
2

मैं इस परिदृश्य में यह सबसे सरल सत्र निर्माण अपने आप को एक डि पुस्तकालय और 'हाइब्रिड' दायरे का उपयोग करके संभाल पाया है StructureMap में, इसे InstanceScope.Hybrid के रूप में परिभाषित किया गया है)। यह एक एएसपीनेट ऐप डोमेन में HttpContext द्वारा उदाहरणों और एक सामान्य ऐप डोमेन में थ्रेडस्टैटिक का उदाहरण देगा, जिससे आप दोनों में एक ही दृष्टिकोण का उपयोग कर सकते हैं।

मुझे यकीन है कि अन्य डी पुस्तकालय एक समान सुविधा प्रदान करते हैं।

+0

यह शायद काम करेगा। लेकिन मैं कैसल का उपयोग करता हूं जिसमें उस तरह की हाइब्रिड लाइफस्टाइल बॉक्स से बाहर नहीं है। तो मुझे इसे खुद बनाना होगा। फिर एनएचबीर्नेट सत्र संदर्भ वर्ग बनाने के लिए यह आसान था (मेरा जवाब देखें)। लेकिन अप्रत्यक्ष रूप से मुझे यह विचार देने के लिए धन्यवाद। :) – Allrameest

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