2015-06-30 31 views
1

如果在整个站点上将标志设置为true,则必须显示多个部分视图。在整个站点上设置标志的正确方法

我在web.config文件中有硬编码标志,并且工作正常。但现在这个标志必须通过我们的后端设置。

该网站有很多的流量,我需要一个适当的方式来达到这一点,我觉得只是做一个SQL请求只是为了检查这个标志是一个矫枉过正。

我虽然关于阅读一个简单的txt文件包含国旗,但我不知道它是否仍然“太多”。

怎么会是最优化的方式?

+0

'但现在这个标志必须通过我们的后端设置。“你是什么意思? – 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调用并查看值到达的位置从。随着这种变化,应该立即从缓存中清除现有值。此外,请确保您没有设置“滑动游戏”而不是“绝对游戏”。 –

0

我会建议定义一个全局配置类,其中包含所有的标志,常用数据,并使用依赖注入将其注入到任何你需要的地方。这将导致我相信更可测试的解决方案。

相关问题