替代web.config中的appsettings(需要持久性)

时间:2014-03-03 16:13:44

标签: c# asp.net-mvc asp.net-mvc-4 web-config appsettings

我目前在Web.config中有一些配置变量,例如:

<appSettings>
 <add key="RecipientEmailForNotifications" value="asdf@sdf.com" />
 <add key="NotifyNewEntries" value="true" />
 <!-- etc... -->
</appSettings>

我有一个视图,管理员用户可以在线更改此值,例如

  

/管理/配置/

     
     

通知的收件人电子邮件:       [ _ __ _ __ _ __ _ _

     

通知新条目:       [x]是的

     

[SAVE]

但这种方法存在两个问题:

  1. 每次部署web.config时,我都会覆盖那些在线保存的值
  2. 每次重新启动Web应用程序时(因为Web应用程序在没有活动时自然停止),在线保存的这些值将重置为上次部署的原始文件
  3. 所以问题是: 实现必须保留配置变量的目标的最佳方法是什么?

    我认为使用表格不是很自然,但我可能错了(请解释原因)。

    此外,在阅读值时使用应用程序设置非常方便:

    ConfigurationManager.AppSettings["RecipientEmailForNotifications"]
    

    与使用数据库相反,

    db.SomeConfigurationTable.SingleOrDefault(.....)
    

1 个答案:

答案 0 :(得分:2)

我将使用数据库存储和缓存的组合。

如果您在单个Web服务器上,则可以将设置存储在proc缓存中。如果您在Web场中,可以查看couchbase(免费memcached)或azure之类的内容。

在应用程序启动时加热缓存可能是有意义的。这是从数据库中读取设置并填充缓存。

另一种流行的方法是进行一次Get调用,首先检查缓存,如果缓存是空的,则填充缓存,例如。

public string Get(string key, Func<string> getItemCallback) 
        {
            var item = Cache.Get(key) as string;
            if (item == null)
            {
                item = db.SomeConfigurationTable.SingleOrDefault(key);
                Cache.Store(key, item);
            }
            return item;
        }

不要忘记更新设置时需要突发缓存。