ASP.NET:存储应用程序设置的位置?

Pre*_*zel 7 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);
}
Run Code Online (Sandbox Code Playgroud)

然后我发现在应用程序运行时将设置保存回"web.config"会导致整个应用程序重新启动.这对我来说似乎是完全不合理的,因为如果我回写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
Run Code Online (Sandbox Code Playgroud)

虽然我不认为我会"设置"P-Key,但使用Auto-Incr索引代替.这样,如果我有一个需要将内容邮寄到多个管理器的应用程序,我可以存储许多:

index     component       setting        value
1         RequestModule   ManagerEmail   manager1@someplace
2         RequestModule   ManagerEmail   manager2@someplace
Run Code Online (Sandbox Code Playgroud)

然后我可以使用:

IEnumerable<string> GetValues(string componentName, string settingName);
Run Code Online (Sandbox Code Playgroud)

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

这有意义吗?

Ars*_*nko 13

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

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

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


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

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

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

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

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

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

  • 如果您还需要为每个经理存储一个布尔值,表明她/他是否想要接收来自您的警报,该怎么办?根据您当前的结构,这是不可能的.
  • 由于相同的设置可以有多个值,您打算如何处理必须唯一的设置?例如,"关于我们"页面上只能显示一个文本值.如果数据库中存储了两个值,该怎么办?


Pau*_*gle 6

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

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

例如.

create table Settings
(Name varchar(50) primary key,
Value varchar(50))
Run Code Online (Sandbox Code Playgroud)

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

  • 'sql_variant`为+1.当存储任何类型的数据时,`nvarchar(max)`不是一个好主意(更不用说`varchar(100)`). (2认同)

And*_*ber 5

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

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


Shy*_*yju 5

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

设置

SETTING_NAME   VARCHAR(100)PRIMARY KEY
SETTING_VALUE  VARCHAR(100)
Run Code Online (Sandbox Code Playgroud)

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

SETTINGS表的Ex数据

    SETTING_NAME         SETTING_VALUE

    AdminEmail            admin@mysite.com
    ErrorTrackingEmail    errors@mysite.com
Run Code Online (Sandbox Code Playgroud)