2015-06-30 2 views
1

У меня есть несколько частичных представлений, которые должны быть показаны, если флаг установлен на true по всему сайту.Правильный способ установки флага по всему сайту

У меня этот флаг жестко закодирован внутри appSettings на моем web.config файле и работает красиво. Но теперь этот флаг должен быть установлен через наш back-end.

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

У меня есть про чтение простого txt-файла, содержащего флаг, но я не знаю, все еще «слишком много».

Как был бы наиболее оптимизированный способ?

+0

'Но теперь этот флаг должен быть установлен через наш back-end'. Что вы подразумеваете под этим? – ramiramilu

+0

Я хотел сказать, что этот флаг больше не может быть жестко запрограммирован. Кто-то другой (наш клиент, не разработчик) должен иметь возможность изменять это значение, не меняя его непосредственно на 'web.config'. –

ответ

3

Отъезд MemoryCache. Вы можете создать базовый статический класс со статическим свойством, чтобы вернуть значение кешированного флага, а затем вы можете определить абсолютное истечение до любого уровня комфорта, с которым вы можете жить (5 секунд или 60 минут или любое время), после которого вы обновляете значение в кеше.

Вот очень быстрый пример для обработки резьбы.

public static class CacheStore 
{ 
    private static readonly string _keyMySharedFlag = "shared.flag"; 
    private static readonly object _lockMySharedFlag = new object(); 
    public static bool MySharedFlag 
    { 
     get 
     { 
      var cachedFlag = (bool?)MemoryCache.Default.Get(_keyMySharedFlag); 
      if (cachedFlag != null) 
       return cachedFlag.Value; 
      lock (_lockMySharedFlag) 
      { 
       // Confirm no other threads wrote to cache while we waited 
       cachedFlag = (bool?)MemoryCache.Default.Get(_keyMySharedFlag); 
       if (cachedFlag != null) 
        return cachedFlag.Value; 
       bool? newFlag = true; // Set to your database value 
       var cachePolicy = new CacheItemPolicy(); 
       cachePolicy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(5); // 5 minutes 
       MemoryCache.Default.Set(_keyMySharedFlag, newFlag, cachePolicy); 
       return newFlag.Value; 
      } 
     } 
    } 
} 
+0

Я думаю, я буду использовать его много, спасибо. –

+0

Он работает хорошо, но, похоже, он длится более 5 минут, на самом деле я ждал 20 минут, и значение осталось прежним до тех пор, пока я не обновил пул приложений, а затем изменил значение. Я скопировал точно такой же код, и я установил значение 'newFlag' для моего значения, управляемого базой данных. Есть идеи? Заранее спасибо. –

+0

Обновление пула приложений эффективно очищает кеш полностью. Чтобы отладить вашу проблему, я бы изменил истечение срока действия cachePolicy на 'DateTimeOffset.Now.AddSeconds (1)', а затем поставил точку останова в первой строке 'var cachedFlag', чтобы пройти через вызовы MemoryCache и посмотреть, где это значение приближается из. С этим изменением существующее значение должно быть выведено из кеша почти сразу. Кроме того, убедитесь, что вы не устанавливаете «SlidingExpiration» вместо «AbsoluteExpiration». –

0

Я хотел бы предложить определить глобальный класс конфигурации, который имеет все флаги, общие данные в нем и использовать Dependency Injection, чтобы ввести его туда, где когда-либо вам нужно. Это приведет к более проверяемому решению, которое я считаю.

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