2012-03-22 3 views
1

Здравствуйте, я новичок в nhibernate, и я пытаюсь создать диспетчер сеансов для веб-приложения, которое позволит мне использовать его, когда его называет новый клиент. Я нашел диспетчера сеансов, который будет хорош для меня. Я думаю, но у меня нет смысла запускать его в моем веб-API, потому что они просто дают код и не реализуют. Может кто-нибудь мне помочь?О диспетчере сеансов NHibernate

using System.Web; 
using NHibernate; 
using NHibernate.Cache; 
using NHibernate.Cfg; 
using System.Runtime.Remoting.Messaging; 

namespace BLLEwidencjaTest 
{ 
    public class NHibernateSessionManager 
    { 
    private static Configuration _configuration; 
    public static NHibernateSessionManager Instance 
    { 
     get 
     { 
      return Nested.NHibernateSessionManager; 
     } 
    } 
    private NHibernateSessionManager() 
    { 
     InitSessionFactory(); 
    } 
    private class Nested 
    { 
     static Nested() { } 
     internal static readonly NHibernateSessionManager NHibernateSessionManager = 
      new NHibernateSessionManager(); 
    } 
    private void InitSessionFactory() 
    { 
     _configuration = new Configuration(); 
     _configuration.Configure(); 
     _configuration.AddAssembly(typeof(NHibernateSessionManager).Assembly); 
     sessionFactory = _configuration.BuildSessionFactory(); 
    } 
    /// <summary> 
    /// Allows you to register an interceptor on a new session. This may not be called if there is already 
    /// an open session attached to the HttpContext. If you have an interceptor to be used, modify 
    /// the HttpModule to call this before calling BeginTransaction(). 
    /// </summary> 
    public void RegisterInterceptor(IInterceptor interceptor) 
    { 
     ISession session = ContextSession; 

     if (session != null && session.IsOpen) 
     { 
      throw new CacheException("You cannot register an interceptor once a session has already been opened"); 
     } 

     GetSession(interceptor); 
    } 
    public ISession GetSession() 
    { 
     return GetSession(null); 
    } 
    /// <summary> 
    /// Gets a session with or without an interceptor. This method is not called directly; instead, 
    /// it gets invoked from other public methods. 
    /// </summary> 
    private ISession GetSession(IInterceptor interceptor) 
    { 
     ISession session = ContextSession; 

     if (session == null) 
     { 
      if (interceptor != null) 
      { 
       session = sessionFactory.OpenSession(interceptor); 
      } 
      else 
      { 
       session = sessionFactory.OpenSession(); 
      } 

      ContextSession = session; 
     } 

     //Check.Ensure(session != null, "session was null"); 

     return session; 
    } 
    /// <summary> 
    /// Flushes anything left in the session and closes the connection. 
    /// </summary> 
    public void CloseSession() 
    { 
     ISession session = ContextSession; 

     if (session != null && session.IsOpen) 
     { 
      session.Flush(); 
      session.Close(); 
     } 

     ContextSession = null; 
    } 
    public void BeginTransaction() 
    { 
     ITransaction transaction = ContextTransaction; 

     if (transaction == null) 
     { 
      transaction = GetSession().BeginTransaction(); 
      ContextTransaction = transaction; 
     } 
    } 
    public void CommitTransaction() 
    { 
     ITransaction transaction = ContextTransaction; 

     try 
     { 
      if (HasOpenTransaction()) 
      { 
       transaction.Commit(); 
       ContextTransaction = null; 
      } 
     } 
     catch (HibernateException) 
     { 
      RollbackTransaction(); 
      throw; 
     } 
    } 
    public bool HasOpenTransaction() 
    { 
     ITransaction transaction = ContextTransaction; 

     return transaction != null && !transaction.WasCommitted && !transaction.WasRolledBack; 
    } 
    public void RollbackTransaction() 
    { 
     ITransaction transaction = ContextTransaction; 

     try 
     { 
      if (HasOpenTransaction()) 
      { 
       transaction.Rollback(); 
      } 

      ContextTransaction = null; 
     } 
     finally 
     { 
      CloseSession(); 
     } 
    } 
    /// <summary> 
    /// If within a web context, this uses <see cref="HttpContext" /> instead of the WinForms 
    /// specific <see cref="CallContext" />. Discussion concerning this found at 
    /// http://forum.springframework.net/showthread.php?t=572. 
    /// </summary> 
    private ITransaction ContextTransaction 
    { 
     get 
     { 
      if (IsInWebContext()) 
      { 
       return (ITransaction)HttpContext.Current.Items[TRANSACTION_KEY]; 
      } 
      else 
      { 
       return (ITransaction)CallContext.GetData(TRANSACTION_KEY); 
      } 
     } 
     set 
     { 
      if (IsInWebContext()) 
      { 
       HttpContext.Current.Items[TRANSACTION_KEY] = value; 
      } 
      else 
      { 
       CallContext.SetData(TRANSACTION_KEY, value); 
      } 
     } 
    } 
    /// <summary> 
    /// If within a web context, this uses <see cref="HttpContext" /> instead of the WinForms 
    /// specific <see cref="CallContext" />. Discussion concerning this found at 
    /// http://forum.springframework.net/showthread.php?t=572. 
    /// </summary> 
    private ISession ContextSession 
    { 
     get 
     { 
      if (IsInWebContext()) 
      { 
       return (ISession)HttpContext.Current.Items[SESSION_KEY]; 
      } 
      else 
      { 
       return (ISession)CallContext.GetData(SESSION_KEY); 
      } 
     } 
     set 
     { 
      if (IsInWebContext()) 
      { 
       HttpContext.Current.Items[SESSION_KEY] = value; 
      } 
      else 
      { 
       CallContext.SetData(SESSION_KEY, value); 
      } 
     } 
    } 
    private bool IsInWebContext() 
    { 
     return HttpContext.Current != null; 
    } 

    private const string TRANSACTION_KEY = "CONTEXT_TRANSACTION"; 
    private const string SESSION_KEY = "CONTEXT_SESSION"; 
    private ISessionFactory sessionFactory; 
    } 
} 
+0

Ваш вопрос непонятен, пожалуйста, уточните. Какое веб-приложение? Удалось ли запустить диспетчер сеансов в тестовом проекте? Также избегайте использования сокращений в ваших вопросах. –

+0

Приложение Asp form, я хочу открыть сеанс один раз за запрос. – Endiss

ответ

3

Хороший полный пример для веб-приложения с использованием NHibernate свой дизайн можно найти в NHibernate best practices.

+1

Thx я использовал его, и он решил проблему :) – Endiss

Смежные вопросы