2012-03-22 134 views
1

你好我是nhibernate的新手,我正在尝试为Web应用程序创建一个会话管理器,这将允许我在新客户端调用它时使用它。我发现一个会话管理器对我来说很好,但我没有点如何在我的web 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

你的问题不清楚,请澄清。什么样的网络应用程序?您是否设法在测试项目中运行会话管理器?同时避免在你的问题中使用缩写。 – 2012-03-22 09:10:47

+0

Asp窗体应用程序,我想打开会议每个请求一次。 – Endiss 2012-03-22 09:23:47

回答

3

使用您的设计NHibernate的Web应用程序一个很好的完整的例子可以在NHibernate best practices找到。

+1

Thx我用它,它解决了问题:) – Endiss 2012-03-23 09:17:00