2011-12-26 6 views
0

Я реализую стандартный сценарий в asp.net-сессии по запросу. Мой asp.net модуль:asp.net Управление сеансом Nhibernate

public class NHibernateSessionModule : IHttpModule 
{ 
    public void Dispose() { } 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += context_BeginRequest; 
     context.EndRequest += context_EndRequest; 
    } 

    void context_BeginRequest(object sender, EventArgs e) 
    { 
     var session = SessionManager.SessionFactory.OpenSession(); 
     session.BeginTransaction(); 
     CurrentSessionContext.Bind(session); 

    } 

    void context_EndRequest(object sender, EventArgs e) 
    { 
     var session = SessionManager.CurrentSession; 
     if (session != null) 
     { 
      try 
      { 
       if (session.Transaction != null && session.Transaction.IsActive) 
        session.Transaction.Commit(); 
      } 
      catch (Exception ex) 
      { 
       session.Transaction.Rollback(); 
       throw new ApplicationException("Error committing database transaction", ex); 
      } 
      finally 
      { 
       session.Close(); 
      } 
     } 
     CurrentSessionContext.Unbind(SessionManager.SessionFactory); 
    } 
} 

Мои sessionManager потокобезопасно singletone:

public class SessionManager 
{ 
    private readonly ISessionFactory sessionFactory; 
    public static ISessionFactory SessionFactory 
    { 
     get { return Instance.sessionFactory; } 
    } 
    private ISessionFactory GetSessionFactory() 
    { 
     return sessionFactory; 
    } 
    public static ISession OpenSession() 
    { 
     return Instance.GetSessionFactory().OpenSession(); 
    } 
    public static ISession CurrentSession 
    { 
     get 
     { 
      if (!CurrentSessionContext.HasBind(Instance.GetSessionFactory())) 
       return null; 
      return Instance.GetSessionFactory().GetCurrentSession(); 
     } 
    } 


    public static SessionManager Instance 
    { 
     get 
     { 
      return NestedSessionManager.sessionManager; 
     } 
    } 
    private SessionManager() 
    { 
     Configuration configuration = new Configuration().Configure(); 
     sessionFactory = configuration.BuildSessionFactory(); 
    } 

    class NestedSessionManager 
    { 
     internal static readonly SessionManager sessionManager = 
      new SessionManager(); 
    } 
} 

Основная идея открыть сеанс в начало запроса, а затем использовать сеанс через SessionManager.CurrentSession;

сессии является хранится в сконфигурированном контексте:

<property name="current_session_context_class">web</property> 

Мой репозиторий:

public class RepositoryNew<T> : BaseRepository<T>, IDisposable 
{ 
    public RepositoryNew() 
    { 
     if (NHibernateSession == null) 
      //Start session for not web version 
    } 
    public void Dispose() 
    { 
     //flush session for not web version 
    } 

    protected override sealed ISession NHibernateSession 
    { 
     get 
     { 
      return SessionManager.CurrentSession; 
     } 
    } 
} 

Использование

protected void Page_Load(object sender, EventArgs e) 
{   
    var repo = new RepositoryNew<Client>() 
    clients = repo.GetAll(); 
} 

По какой-то причине это хранилище не использует открытую сессию в модуле.

CurrentSessionContext.HasBind(Instance.GetSessionFactory()) 

возвращает false, поэтому мой код запускает вторую сессию в запросе. В отладчике я вижу, что дважды активировал свой SessionManager. У меня есть два разных завода ISesssion. У меня еще нет идей, что не так. Я потратил на это много часов.

ответ

0

Странная ошибка. Когда я удаляю ссылку на SessionManager из моего проекта, он начинает работать правильно.

0

Может быть, еще одна вещь, открыть сеанс в Http Begin запроса, потому что каждый запрос HTTP будет открыт новый сеанс, как запрос статического изображения вы должны изменить эту стратегию, чтобы устранить эту ненужную сессию в каждом запрос HTTP вы можете прочитать этот блог и изменить свою стратегию http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspx

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