Asp.net 在哪里存储应用程序设置?

Asp.net 在哪里存储应用程序设置?,asp.net,web-config,appsettings,application-settings,Asp.net,Web Config,Appsettings,Application Settings,最近,我发现“Web.Config”文件包含一个部分,它似乎适合存储应用程序设置。见鬼,它甚至有一种通过标准系统库访问文件的编程方式。因此,我非常聪明,编写了一个接口来访问它,然后是接口的具体实现,如下所示: public interface IAppSettings { IEnumerable<string> GetValues(string componentName, string settingName); IEnumerable<KeyValuePai

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

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);
}
然后我可以使用:

IEnumerable<string> GetValues(string componentName, string settingName);
IEnumerable GetValues(字符串组件名、字符串设置名);
它将返回一个电子邮件地址列表,而不仅仅是一个值


这有意义吗?

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


对于更短暂的设置,您可能只想使用一个简单的数据库系统-如果您的应用程序不使用数据库,则即使是
App\u Data
dir中的平面文件/XML也可以工作。

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

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

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


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

如果需要存储异构的唯一条目如下所示:

settings:
name NVARCHAR(255) PRIMARY KEY
value NVARCHAR(255) NOT NULL
  • 管理员的邮件地址
  • 在网站主页上显示的最大条目数
  • 要在“关于我们”页面上显示的文本
  • 指示是否启用公共注释的布尔值
然后您必须使用
varchar
s或其他或多或少友好的类型作为键来标识条目(而不是通过它们的索引来引用它们)

另一方面,如果您的目的是存储多个经理的邮件地址,则应创建一个
经理
表,其中包含他们的邮件地址、姓名、上次连接的日期时间等

你真的不应该把两者混在一起。理论上,您可以按组件/设置对引用设置中的条目。在实践中,这会使事情变得更加困难,并产生一系列问题:

  • 此外,如果您需要为每个经理存储一个布尔值,指示她/他是否希望接收来自您的警报,该怎么办?按照你目前的结构,这是不可能的
  • 由于同一设置可以有多个值,您打算如何处理必须唯一的设置?例如,“关于我们”页面上必须只显示一个文本值。若数据库中存储了两个值怎么办

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

设置 然后编写一个类,该类可以向该表插入、删除和更新值

设置表的Ex数据

    SETTING_NAME         SETTING_VALUE

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

创建一个键值表,如下所示:

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

将设置存储在web.config中非常有用,因为这样可以在不同的环境中轻松设置。但是,正如您所说,如果您可能希望在实时环境中更改设置,那么这是没有用的

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

例如


如果使用SQL Server,可以设置为Value列为“代码> SQLYROVERATIONEX/CODE >,这将允许您存储多种数据类型。

< P>首先,当您考虑在Web.CONFIG文件中存储什么信息时,这并不完全是不合理的。当您更改程序集信息、连接字符串等内容时,应用程序需要停止并重新加载要使用这些设置运行的值

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


如果您正在谈论存储每个用户的设置,您应该签出。

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


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

我通常会添加一个“类型”字段,以便我只检索所需的设置组。这对我来说是一种将类似设置分组并立即检索它们的方法。

如果需要保存设置,可以始终将它们保存在自定义配置文件中


不久前我就这么做了,我有代码可以做。

name
应该是主键。单独的列没有意义,我没有考虑过一个应用程序可能运行在多个服务器上,但这是有意义的。在我的例子中,这可能永远不会发生,因为这是一个公司内部的项目,但要记住这一点很好。我只是在寻找如何储存一个
    SETTING_NAME         SETTING_VALUE

    AdminEmail            admin@mysite.com
    ErrorTrackingEmail    errors@mysite.com
settings:
name NVARCHAR(255) PRIMARY KEY
value NVARCHAR(255) NOT NULL
create table Settings
(Name varchar(50) primary key,
Value varchar(50))