我想知道应用程序设置对于存储值是否可靠?
我正在考虑将应用程序的 XML 文件路径存储在那里,这样当我运行程序时,即使路径在上次运行时被更改,它也会知道 XML 文件的位置。
-
应用程序设置是否有可能忘记/释放文件路径值?或者也许还有其他与此相关的内容?
-
有没有更好的方法来实现我的目标?
是的,它们是可靠的。他们会做得很好,因为他们会考虑特定于操作系统的约定和操作系统用户配置文件。所以,我会说这是一种推荐的做法。
有一个小问题:应用程序的更高版本可能会查找其自己版本的设置,即使存在旧版本的设置也是如此。在这种情况下,您必须确保应用迁移旧设置并将其转换为自己的设置,而不是忽略它们。这很容易。
还有一个更大的问题:将应用程序移动到磁盘中的另一个位置将导致它将自己视为一个新实例并进行自己的设置。如果你想避免这种行为,你必须考虑创建一个强名称的程序集(至少可以说,我觉得这很不方便(。
如前所述,是的,应用程序设置是可靠的,并且由Chatzigiannak很好地解释。但是,我想与您分享有关此处发生的应用程序设置的一些注意事项。
我们当前正在使用外部文件,并将其加载到 web.config 中。很简单:
<appSettings file="DIRConfigurationAppSettings.config"></appSettings>
此代码分布在我们的 15 个网站上。该文件如下所示:
<?xml version="1.0"?>
<appSettings>
<add key="CacheEnabled" value="0"/>
...
</appSettings>
然后我们意识到这个文件正在增长,现在它有 600 个密钥,很酷不是吗?但这还不是最糟糕的部分,每个服务器都必须有自己的配置,所以我们通过 7 台服务器传播这个文件......其中一些有不同的键...想象一下,您必须在所有服务器中更改一个特定密钥的路径......我们创造了一个怪物=(
在进行代码审查时,我们决定将其存储在数据库中。一个简单的表,其中机器 IP 作为键,键值 JSON 作为文档。当然不是 600 列。
当我告诉我的团队我正在这样做时,一个人说:"你疯了吗?您将不得不更改此代码的 1k":
ConfigurationManager.AppSettings["KEYNAME"];
确实是的,我必须更改它,但是我想以一种简单的方式,创建了我自己的ConfigurationManager,其中包含NameValueCollection AppSettings:
public static class ScopeManager
{
private static NameValueCollection _appSettings;
public static NameValueCollection AppSettings
{
get
{
if (_appSettings.IsNull())
{
//GET FROM DATABASE, CACHE OR SOMEWHERE ELSE
}
return _appSettings;
}
}
}
变化变成了:
ScopeManager.AppSettings["KEYNAME"];
我不认为我们重新发明了轮子。但是我们已经做了一个更好的方法来处理大量的密钥/网站/服务器......似乎更真实的世界。