О менеджере сессий NHibernate - PullRequest
1 голос
/ 22 марта 2012

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

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;
  }
}

1 Ответ

3 голосов
/ 22 марта 2012

Хороший полный пример веб-приложения NHibernate, использующего ваш дизайн, можно найти в рекомендациях NHibernate .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...