В настоящее время я создаю систему, которая в некоторых случаях, если база данных недоступна, вместо этого использует MSMQ. Например. если приложение (в одном из случаев это веб-служба wcf) запускается и база данных недоступна, все входящие запросы должны быть записаны в MSMQ. Когда база данных снова станет доступной, запросы должны быть снова записаны в БД.
Я использую NHibernate и фабрика сессий обернута синглтоном. Вот как выглядит сервис:
try
{
// to database (just an example)
SessionProvider.Current.CurrentSession.Save...
}
catch(NHibernate.ADOException)
{
// to msmq
}
Эта настройка работает, когда служба в течение некоторого времени запущена и работает, а фабрика сеансов была построена. При остановке сервера SQL возникают исключения ADO и все правильно записывается в 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();
}
}