代码在这里: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是内置方法?
答案 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会话。