【发布时间】:2010-10-20 14:23:55
【问题描述】:
最近,我发现“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,而是使用自动增量索引。这样,如果我有一个应用程序需要向多个管理员发送邮件,我可以存储多个:
index component setting value
1 RequestModule ManagerEmail manager1@someplace
2 RequestModule ManagerEmail manager2@someplace
然后我可以使用:
IEnumerable<string> GetValues(string componentName, string settingName);
它会返回一个电子邮件地址列表,而不仅仅是一个值。
这有意义吗?
【问题讨论】:
-
使用 DB 存储应用程序设置是可以的,但请将设置存储在缓存中。 Web 配置中的设置可以快速阅读,因为它们位于服务器内存中。如果您经常阅读每个页面中的设置,请考虑将缓存添加到您的设置中,并在设置更新时从缓存中删除它们。
-
在您编辑后,我编辑了我的答案。请注意,当您有两个问题时,请分别提出,而不是将第二个问题添加到前一个问题中。
标签: asp.net web-config appsettings application-settings