存储应用程序设置的位置?

时间:2010-10-20 14:23:55

标签: asp.net web-config appsettings application-settings

最近,我发现“Web.Config”文件包含一个<appSettings>部分,它似乎适合存储一个应用程序设置。哎呀,它甚至有一种通过标准系统库访问文件的编程方式。所以聪明一点,我写了一个接口来访问它,然后是接口的具体实现,如下所示:

public interface IAppSettings
{
    IEnumerable<string> GetValues(string componentName, string settingName);
    IEnumerable<KeyValuePair<string, string>> GetValuePairs(string componentName, string settingName);
    void SetValues(string componentName, string settingName, IEnumerable<string> valueList, bool append);
    void SetValuePairs(string componentName, string settingName, IEnumerable<KeyValuePair<string, string>> pairList, bool append);
}

然后我发现saving settings back to "web.config" while the application is running causes the entire application to re-start。这对我来说似乎是完全不合理的,因为如果我回写web.config并且应用程序每次都重新启动,那么像HttpRuntime.Cache这样的东西会被彻底清空,使得我的Cache无用,因为它会不断清空和重新填充。

所以我想知道:我应该在哪里存储我的应用程序设置?

有没有一个很好的解决方案,所以我不必自己滚动?

编辑:

好的,感谢所有建议使用数据库和潜在表格架构的人。我想我将采用以下架构:

settings:
    index NUMBER NOT NULL AUTO_INCREMENT   <== Primary Key
    component NVARCHAR(255) NOT NULL
    setting NVARCHAR(255) NOT NULL
    key   NVARCHAR(255)
    value NVARCHAR(255) NOT NULL

虽然我不认为我会设置P-Key,但是使用Auto-Incr索引。这样,如果我有一个应用程序需要向多个管理器发送邮件,我可以存储许多:

index     component       setting        value
1         RequestModule   ManagerEmail   manager1@someplace
2         RequestModule   ManagerEmail   manager2@someplace

然后我可以使用:

IEnumerable<string> GetValues(string componentName, string settingName);

它将返回一个电子邮件地址列表,而不仅仅是一个值。

这有意义吗?

9 个答案:

答案 0 :(得分:13)

web.config通常用于只读设置,即。系统管理员在部署应用程序期间设置的设置。

如果要阅读编写设置,最明显的方法是使用数据库。顺便说一句,这有一个优点:应用程序可以托管在多个服务器上,仍然可以正确读写设置,

您还可以为设置实现自定义存储,但实施起来可能会更困难,而且速度也不会太快。


要回答第二个问题,数据库的结构取决于您要存储的设置类型。

如果您需要存储异构的唯一条目,请执行以下操作

  • 管理员的邮件地址,
  • 网站主页上显示的最大条目数
  • 要在“关于我们”页面上显示的文字,
  • 指示是否启用公共评论的布尔值,

然后你必须使用varchar或其他或多或少友好类型作为键来识别条目(而不是通过它们的索引来引用它们)。

另一方面,如果您的目的是存储多个管理员的邮件地址,则应创建一个Manager表,其中包含其上次连接的邮件地址,名称,日期时间等等。

你真的不应该混合。理论上,您可以按组件/设置对参考设置中的条目。在实践中,它会使事情变得更难并产生一系列问题:

  • 如果您还需要为每位经理存储一个布尔值,表明她/她是否希望收到您的提醒,该怎么办?根据您目前的结构,这是不可能的。
  • 由于相同的设置可以有多个值,您打算如何处理必须唯一的设置?例如,“关于我们”页面上只能显示一个文本值。如果数据库中存储了两个值,该怎么办?

答案 1 :(得分:6)

在web.config中存储设置非常有用,因为它可以在不同环境中轻松进行不同的设置。但是,如您所说,如果您可能想要更改实时环境中的设置,则无用。

如果需要更改值,则使用简单的数据库表是最有用的方法。

例如

create table Settings
(Name varchar(50) primary key,
Value varchar(50))

如果您使用的是SQL Server,则可以将Value列设置为sql_variant,这样您就可以存储各种数据类型。

答案 2 :(得分:5)

它适用于应用程序设置,但不适用于在运行时期间动态更改的设置。相反,它只适用于偶尔更改的设置,以及当应用程序发生更改时您希望(甚至希望)重新启动的位置。

对于更多的短暂设置,您可能只想使用一个简单的数据库系统 - 如果您的应用程序不使用数据库,即使App_Data目录中的平面文件/ XML也可以正常工作。

答案 3 :(得分:5)

是。更改web.config将重置应用程序。我通常会维护一个设置表来存储设置的键值对,并从那里访问它。

设置

SETTING_NAME   VARCHAR(100)PRIMARY KEY
SETTING_VALUE  VARCHAR(100)

然后编写一个可以插入,删除,更新值到此表的类。

SETTINGS表的Ex数据

    SETTING_NAME         SETTING_VALUE

    AdminEmail            admin@mysite.com
    ErrorTrackingEmail    errors@mysite.com

答案 4 :(得分:2)

我通常会在设置表中添加一个“类型”字段,以便我只检索这对我有用的设置组,作为对设置进行分组并一次检索它们的方法。

答案 5 :(得分:1)

像这样创建一个键值表:

settings:
name NVARCHAR(255) PRIMARY KEY
value NVARCHAR(255) NOT NULL

答案 6 :(得分:1)

首先,当您考虑应该在web.config文件中存储哪些信息时,这根本不是不合理的。当您更改汇编信息,连接字符串等内容时,您的应用程序需要停止并重新加载值以使用这些设置运行。

如果您要存储应用程序范围的设置,则可以在数据库中创建“设置”表,甚至可以使用单独的文本文件来存储设置。

如果您正在讨论存储每个用户的设置,那么请查看ASP.NET Profile Properties

答案 7 :(得分:1)

应用程序范围的设置当然应存储在web.config文件的此部分中,因为它可以防止可能随时间变化的硬编码值。没有必要使用您自己的代码读取它们,因为有一个内置方法:使用System.Configuration.ConfigurationManager.AppSettings数组来检索它们(您需要在项目中添加对System.Configuration程序集的引用) 。您也可以通过ASP.NET网站管理工具编辑AppSettings(项目菜单 - > ASP.NET配置)。

对于您设想更频繁更改的值以及站点启动和运行时,使用XML文件,轻量级数据库(例如SQLite或SQL Server Compact)或甚至文本文件来进行这些设置是合理的。

答案 8 :(得分:0)

如果您需要保存设置,可以随时将它们保存在自定义配置文件中。

我曾经做过一段时间,我有可用的代码here