2011-03-04 2 views
0

Есть ли способ принудительно сбросить экземпляр singleton всякий раз, когда пользователь обновляет базу данных?Как сбросить экземпляр singleton в C#?

public class Example{ 
     private Dictionary<int, string> _list; 

     private Example(){ 
     _list = new Dictionary<int, string>(); 
     //Get data from database here and add the data to _list 
     } 

     private class Nested{ 
      static Nested(){} 
      internal static readonly Example Instance = new Example(); 
     } 

     public static Dictionary<int, string> GetExample(){ 
     return Nested.Instance._list 
     } 

} 

Итак, я могу сбрасывать _list, когда база данных обновляется?

Спасибо!

+1

Откуда вы знаете, что база данных обновлена? И какова польза класса Nested? – RQDQ

+0

лучше использовать кеш и установить истечение срока службы SQL, в любом случае в зависимости от ваших потребителей данные, которые вы должны защитить для условий гонки при обновлении –

ответ

6

Короткий ответ: Нет

Ближайший вещь, которую вы можете получить, чтобы сбросить словарь:

Теперь длинный ответ ...

Почему вы с помощью синглтон? Я предполагаю, что это потому, что вы читали книгу шаблонов дизайна GoF и считали, что это выглядит весело. Одноэлементный шаблон разбивает каждый принцип объектно-ориентированного дизайна. Вы не можете наследовать от них, вы нарушаете инкапсуляцию и нет никаких шансов на полиморфизм.

В приведенном выше примере вы передаете внутреннюю работу вашего класса (словаря) всем, кто этого хочет. Что делать, если они меняют его? Как это будет работать с потоками?

Если вам нужен только один экземпляр вашего класса в вашем приложении, тогда вызывается только один раз один раз или используйте контейнер инъекции зависимостей с одним стилем жизни, но это совсем другая тема.

Урх, я ненавижу одиночные игры.

+0

Итак, какой шаблон/механизм вы предлагаете для кеширования? Вот как это делается в ASP.net и многих других фреймворках. – RQDQ

+0

+1 только для этой последней строки !! (плюс это был хороший ответ;)) – Pharabus

+0

ASP.net имеет встроенное кэширование, которое будет хранить фрагменты страницы для вас. Если вы хотите сделать кеширование уровня записи или активное истечение срока действия и хотите получить хитрость, существует множество опций, таких как memcached или redis. Если вам нужно придерживаться стека microsoft, то с этим может помочь приложение (скорость). – jonnii

0

Один из способов сделать это - использовать ленивую загрузку и предоставить метод «Invalidate» или «Reset».

public class Example 
{ 
    private static Dictionary<int, string> _list; 

    public static void Invalidate() 
    { 
     _list = null; 
    } 

    public static Dictionary<int, string> GetExample() 
    { 
     if (_list == null) 
      _list = new Dictionary<int, string>(); 

    return _list; 
    } 
} 

Одна вещь, на которую нужно обратить внимание, это не настроено для многопоточных вообще. Класс Dictionary не рекомендуется для повторного кода, и в методах GetExample и Invalidate должна быть какая-то блокировка.

+0

Не будет ли это всегда возвращать null? –

+0

@ Джошуа Эвенсен - совершенно верно. Я исправил код. – RQDQ

Смежные вопросы