我创建了一个配置文件 App.config,其中包含与我的应用程序相关的所有操作参数。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="MinConnectionCount" value="2"/>
<add key="MaxConnectionCount" value="7"/>
</appSettings>
</configuration>
为了读取这些值并使它们对整个应用程序可用,只需使用 ConfigurationManager
类的 AppSettings
属性,如下所示:
try
{
NameValueCollection myAppSettings = ConfigurationManager.AppSettings;
byte min = byte.Parse(myAppSettings["MinConnectionCount"]);
byte max = byte.Parse(myAppSettings["MaxConnectionCount"]);
}
catch (ConfigurationErrorsException e)
{
throw e;
}
AppSettings
属性读取的值是字符串类型,所以必须进行必要的转换和检查:
- 您必须进行适当的转换,确保没有解析错误。验证转换获得的值是否与应用程序域一致可能很有用:例如,最小连接数必须小于最大连接数。
- 任何涉及加载配置的事情都必须在应用程序启动时完成,因为加载的参数可用于分配任何数据结构,如表、队列等。如果在加载配置时遇到错误,应用程序应使用默认配置:可能会通过警报报告错误。
- 最后,配置必须是只读的,这意味着在应用程序运行时不应更改它们。这也简化了多线程的访问。
为了实现这些目标,我创建了一个类,它从文件中加载配置并通过适当的属性提供转换后的参数。
public class MyConfiguration
{
enum Errors
{
CONNECTION_RANGES_ERROR
// some other errors
}
private byte m_MinConnectionCount;
private byte m_MaxConnectionCount;
private readonly List<Errors> m_ConfigErrors = new List<Errors>();
public MyConfiguration()
{
try
{
NameValueCollection appSettings = ConfigurationManager.AppSettings;
if (!SetConnectionRanges(appSettings["MinConnectionCount"], appSettings["MaxConnectionCount"]))
m_ConfigErrors.Add(Errors.CONNECTION_RANGES_ERROR);
// ...
}
catch (ConfigurationErrorsException e)
{
throw e;
}
}
private bool SetConnectionRanges(string minCountStr, string maxCountStr)
{
if (byte.TryParse(minCountStr, out m_MinConnectionCount)
&& m_MinConnectionCount > 0
&& byte.TryParse(maxCountStr, out m_MaxConnectionCount)
&& m_MaxConnectionCount > m_MinConnectionCount)
return true;
m_MinConnectionCount = 2;
m_MaxConnectionCount = 7;
return false;
}
public byte MinConnectionCount { get { return m_MinConnectionCount; } }
public byte MaxConnectionCount { get { return m_MaxConnectionCount; } }
public List<Errors> GetErrors() { return m_ConfigErrors; }
}
GetErrors()
方法允许获取配置参数加载期间发生的错误列表:用户可能会收到这些错误的通知,并且可能会被告知应用程序已使用参数的默认值。
- 如何确保此类在应用程序启动期间首先被实例化?
- 我可以将单例模式应用于此类:这样我应该只调用一个
Instance
属性作为Main
方法的第一条语句。但是我应该在 WPF 应用程序中的什么地方调用Instance
属性? - 我可以为
MyConfiguration
类创建一个全局变量,并调用GetErrors()
方法作为Main< 的第一条语句,而不是使用单例模式
方法。但是我应该在 WPF 应用程序中的什么地方调用GetErrors()
方法?
最佳答案
将您的类更改为static
以确保它只有一个实例。
然后您可以在您显示的第一个表单的 Load
事件中调用 MyConfiguration.GetErrors()
并报告错误。
关于c# - 如何在应用程序启动时加载配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11393324/