在Global.asax中处理NHibernate的启动问题

时间:2010-10-04 14:21:30

标签: wcf nhibernate global-asax

我有一个WCF服务,在IIS内部托管,使用NHibernate进行数据访问。

在我的Global.asax中,我在Application_Start上配置了NHibernate。这意味着我只执行为WCF服务设置一次所有映射的昂贵任务。

唯一的问题是,如果数据库在启动期间不可用,则映射将永远不会设置(因为它们将无法在Application_Start期间设置,并且在应用程序之前不会再次调用该事件游泳池被回收)。

我如何处理NHibernate设置,因此它只发生一次,除非出现错误(例如数据库不可用),在这种情况下,它会在每个请求上发生,直到它起作用?

2 个答案:

答案 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调用的方法。