帮助理解这个nhibernate会话管理代码片段

时间:2011-09-12 14:01:51

标签: asp.net-mvc nhibernate

这基于:http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspx

代码在这里:https://gist.github.com/852307

我的问题是在DAO:

//Example of dao
public class Dao<T> : IDao<T>
{
    private readonly ISessionFactory sessionFactory;

    public Dao(ISessionFactory sessionFactory)
    {
        this.sessionFactory = sessionFactory;
    }

    public void Save(T transient)
    {
        sessionFactory.GetCurrentSession().Save(transient);
    }
}

我想ISessionFactory使用windsor自动接线?

public class NHibernateInstaller : IWindsorInstaller
{
    #region IWindsorInstaller Members

    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<ISessionFactory>()
                               .UsingFactoryMethod(k => BuildSessionFactory()));

        container.Register(Component.For<NHibernateSessionModule>());

        container.Register(Component.For<ISessionFactoryProvider>().AsFactory());

        container.Register(Component.For<IEnumerable<ISessionFactory>>()
                                    .UsingFactoryMethod(k => k.ResolveAll<ISessionFactory>()));

        HttpContext.Current.Application[SessionFactoryProvider.Key]
                        = container.Resolve<ISessionFactoryProvider>();
    }

    #endregion
    public ISessionFactory BuildSessionFactory() { ... }
}

但在DAO中,当调用该方法时:

sessionFactory.GetCurrentSession()

此代码段和打开会话的HttpModule如何工作?

我没看到GetCurrentSession()如何挂钩HttpModule打开的会话,因为GetCurrentSession是内置方法?

1 个答案:

答案 0 :(得分:2)

它正在使用NHibernate上下文会话:
http://www.nhforge.org/doc/nh/en/index.html#architecture-current-session

所有的魔法都发生在 LazySessionContext 中。每当调用bind方法时,这会将会话保存在nhibernate 上下文中。在您的情况下,上下文将是 LazySessionContext ,它是此应用程序使用的自定义上下文(继承自NH的ICurrentSessionContext)。在nhibernate版本3.2中有4或5种不同类型的标准上下文会话。

GetCurrentSession 方法基本上从早先检索你保存的(在bind调用中保存的会话)NH会话。