2009-09-15 2 views
1

В настоящее время я создаю систему, которая в некоторых случаях, если база данных недоступна, вместо этого использует MSMQ. Например. если приложение (в одном из случаев это веб-служба wcf) запускается, а база данных недоступна, все входящие запросы должны быть записаны в MSMQ. Когда база данных снова будет доступна, запросы должны быть снова записаны в db. Я использую NHibernate, и фабрика сеансов обернута синглом. Это то, что услуга выглядит следующим образом:Что делать, если заводская фабрика Nhibernate не работает?

try 
{ 
    // to database (just an example) 
    SessionProvider.Current.CurrentSession.Save...  
} 
catch(NHibernate.ADOException) 
{ 
    // to msmq 
} 

Эта установка работает, когда служба и работает в течение некоторого времени, и сессия завод был билд. При остановке исключений ADO SQL Server повышаются, и все правильно записывается в MSMQ.

Теперь моя проблема. Если база данных недоступна до того, как служба запущена в первый раз, фабрика сеансов не может быть создана и исключение TypeInitializationException. Мой сингл-сайт-провайдер теперь сломан. Поэтому, когда база данных снова запущена, мне почему-то нужен способ перестроить фабрику сеансов. Смогу ли я сделать этот таймер? Как пытаться перестроить его каждые 5 минут? Как я могу «переустановить» синглтон?

Вот выдержка из шаблона поставщика сеанса я использую:

public sealed class SessionProvider : ISessionProvider 
{ 
    private ISessionFactory sessionFactory; 

    private SessionProvider() 
    { 
     sessionFactory = new Configuration().Configure().BuildSessionFactory(); 
    } 

    public static ISessionFactory SessionFactory 
    { 
     get 
     { 
      return Nested.SessionProvider.sessionFactory; 
     } 
    } 

    public static ISessionProvider Current 
    { 
     get 
     { 
      // TypeInitializationException is thrown when building session factory fails 
      return Nested.SessionProvider;         
     } 
    } 

    private class Nested 
    { 
     internal static readonly SessionProvider SessionProvider = new SessionProvider(); 
    } 
} 
+1

1. Можете ли вы отправить сообщение об ошибке в полном объеме (возможно, с stacktrace?). Возможно, ошибка nh init может быть решена. 2. Ваш SessionProvider() обновляет sessionFactory каждый раз, когда он используется, рефакторинг, как указывает Beatles1692. 3.Если исключение происходит, ваш синглтон не сломается. Для каждого последующего вызова SessionProvider(), что init работает, ваше приложение будет работать правильно – Jaguar

ответ

1

Я предлагаю вам изменить SessionProvider так:

...  
     private ISessionFactory sessionFactory; 
     private Configuration config; 

      private SessionProvider() 
      { 
       config= new Configuration(); 
       config.Configure(); 
      } 


     public static ISessionFactory SessionFactory 
      { 
       get 
       { 
        if(sessionFactory==null) 
         sessionFactory=config.BuildSessionFactory(); 

         return Nested.SessionProvider.sessionFactory; 
       } 
      } 
... 
Смежные вопросы