.NET配置设置功能不像我想的那样灵活。 如果我正确理解Application Settings,我就可以更改/编辑设置时受到限制。在C#中,应用程序设置分为两种不同的类型或范围("应用程序"和"用户"),但两者在如何更改或修改它们方面都有局限性。下表显示了不同之处:
SCOPE: | EDIT AT DESIGN-TIME: | EDIT AT RUN-TIME: | EDIT BETWEEN SESSIONS: --------------------------------------------------------------------------------------- User | Setings.settings | Settings.Default.Save() | *Not supported* Application | Setings.settings | *Not supported* | edit app.exe.config
有没有"内置"设置功能,允许我通过所有三种机制编辑设置?使用配置文件的主要动机之一是允许用户更改默认值而无需重新构建源代码(可以使用应用程序作用域设置完成)。但是,用户不应该强制编辑.config文件;他们还应该能够在运行时进行跨设置的更改(可以使用用户范围的设置完成)。当然必须有某种机制提供两种功能。
BOTTOM LINE 为什么无法在运行时编辑应用程序设置(app.exe.config
)?这将解决我所有的问题。 我知道这可能会导致共享同一台计算机的用户出现问题。但是谁又这样做了?
可能的解决方法:无论如何都要将用户设置配置文件的默认存储位置更改为非隐藏文件夹?
更新(澄清):
我要说的是,我希望能够在设计时,运行时,或 中间会话(即通过编辑配置文件)。但是当使用Settings.settings
提供的内置C#持久性机制时,我必须在3中选择最多2个。我错过了什么吗?还有其他我不知道的选择吗?
[ 使用案例: 我想存储"默认"连接字符串的数据库名称,但我希望用户能够在运行时指定不同的数据库(从而成为该用户的" new"默认值)。但我也希望能够覆盖配置文件中的默认值而无需重新运行或重新构建应用程序。]
[ 更好的使用案例: (回应评论)
我有一个配置文件的计算模型,其中包含模型中参数的默认值。用户A启动模型并决定更改多个参数的值。对于该用户的所有未来会话 (即,在运行时编辑),此更改需要持久。随后,该用户希望共享该修改后的内容配置文件与他的团队(例如,通过版本控制存储库,或电子邮件)。这将允许用户B更新其默认参数值(以匹配用户A' s),而无需在应用程序中手动更改它们(即,在会话之间编辑)。所有这些mod应该在设计时之后发生。]
* 我意识到我可以"技术上"编辑位于隐藏的AppData文件夹中的app.exe.config文件中的用户范围设置,但这是一个隐藏文件,并非所有用户都有足够的权限来查看它。 (但请参阅"潜在的解决方法"上面。)
答案 0 :(得分:0)
您需要做的就是结合这两种技术!
在会话开始时,从配置文件中读取配置的设置,并将其存储为可写的全局静态变量(或任何形式的持久性)。
然后,当用户决定更改此设置时,只需更改设置的值。
public static Program {
public static string ConnectionString { get; set; }
void Main(string connectionString) {
ConnectionString = connectionString;
}
}
public class SomeOtherClass {
public void SomeOtherMethod () {
Program.ConnectionString = "new value";
}
}
这只是你如何使用它的一个非常简单的例子。请注意,您可以选择从应用程序设置中读取默认值,而不是将字符串作为参数传递给程序。您还可能将用户配置的连接字符串存储到某种类型的数据库中,这样每个用户的数据库可能会有所不同。
答案 1 :(得分:0)
如果您在案例研究中尝试了以下内容并将其推广,该怎么办?
我将这种技术用于需要用户定义一些重要细节的所有应用程序,例如"存储图像的位置,数据库名称,连接字符串,......等"
希望这会给你一个暗示或什么