我有一个WCF服务,在IIS内部托管,使用NHibernate进行数据访问。
在我的Global.asax中,我在Application_Start上配置了NHibernate。这意味着我只执行为WCF服务设置一次所有映射的昂贵任务。
唯一的问题是,如果数据库在启动期间不可用,则映射将永远不会设置(因为它们将无法在Application_Start期间设置,并且在应用程序之前不会再次调用该事件游泳池被回收)。
我如何处理NHibernate设置,因此它只发生一次,除非出现错误(例如数据库不可用),在这种情况下,它会在每个请求上发生,直到它起作用?
答案 0 :(得分:0)
你需要的是一个Lazy Singleton作为你的SessionFactory。您调用方法来获取会话工厂,并检查会话是否已存在。 因此,创建会话工厂的昂贵任务是在第一次有人需要时完成。
你可以这样做:
public ISessionFactory GetSessionFactory()
{
// sessionFactory is STATIC
if (sessionFactory == null)
{
global::NHibernate.Cfg.Configuration cfg = new NHibernateConfigurationFactory(CurrentConfiguration).GetConfiguration(sessionFactoryName);
// Now that we have our Configuration object, create a new SessionFactory
sessionFactory = cfg.BuildSessionFactory();
if (sessionFactory == null)
{
throw new InvalidOperationException("cfg.BuildSessionFactory() returned null.");
}
}
return sessionFactory;
}
此处提供了完整的解决方案:
NHibernate - good complete working Helper class for managing SessionFactory/Session
答案 1 :(得分:0)
我正在把这个答案放到混合中以便对它进行评论 - 这个答案通过电子邮件发送给我,但在我决定最终解决方案之前,我会欣赏SO社区的观点...
使用Begin_Request事件,而不是使用Application_Start事件。将NHibernate会话存储在一个字段和Begin_Request事件中,检查该字段是否为null,如果是,则创建NHibernate会话(否则,继续使用已创建的会话)。
基本上,这意味着将创建逻辑移动到我可以在“检测到会话尚未创建”的情况下从Begin_Request调用的方法。