Решение проблем запуска с помощью NHibernate в Global.asax - PullRequest
1 голос
/ 04 октября 2010

У меня есть служба WCF, размещенная внутри IIS, использующая NHibernate для доступа к данным.

В моем Global.asax я настраиваю NHibernate на Application_Start. Это означает, что я выполняю дорогостоящую задачу по настройке всех сопоставлений только один раз для моей службы WCF.

Единственная проблема с этим состоит в том, что если база данных была недоступна во время запуска, сопоставления никогда не будут установлены (так как они не будут настроены во время Application_Start, и событие не будет вызываться снова, пока приложение не будет запущено). бассейн переработан).

Как я могу обработать настройку NHibernate, чтобы она возникала только один раз, кроме случаев, когда возникает ошибка (например, недоступность базы данных), и в этом случае она будет возникать при каждом запросе, пока он не будет работать?

Ответы [ 2 ]

0 голосов
/ 05 октября 2010

Я добавляю этот ответ в смесь, чтобы получить комментарии к нему - этот ответ был отправлен мне по электронной почте, но я был бы признателен за мнение сообщества SO, прежде чем я приму окончательное решение ...

Вместо использования события Application_Start используйте событие Begin_Request. Сохраните сеанс NHibernate в поле и в событии Begin_Request проверьте, является ли поле пустым, и если это так, создайте сеанс NHibernate (в противном случае продолжайте использовать уже созданный).

По сути, это будет означать перемещение логики создания в метод, который я могу вызвать из Begin_Request в случае "обнаружения того, что сеанс еще не был создан".

0 голосов
/ 04 октября 2010

Вам нужен ленивый синглтон, чтобы стать вашим 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 - хороший полный рабочий класс Helper для управления SessionFactory / Session

...