如何在应用程序启动时加载配置?

时间:2012-07-09 10:34:10

标签: c# .net wpf

我创建了一个配置文件 App.config ,其中包含与我的应用程序相关的所有操作参数。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="MinConnectionCount" value="2"/>
    <add key="MaxConnectionCount" value="7"/>
  </appSettings>
</configuration>

为了读取这些值并使它们可供整个应用程序使用,只需使用AppSettings类的ConfigurationManager属性,如下所示:

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()方法允许获取在加载配置参数期间发生的错误列表:可以通知用户这些错误,并且可以通知用户应用程序已使用默认值参数。

  1. 如何确保在应用程序启动期间首次实例化此类?
  2. 我可以将单例模式应用于此类:这样我应该只调用Instance属性作为Main方法的第一个语句。但是,我应该在哪里调用WPF应用程序中的Instance属性?
  3. 我可以为MyConfiguration类创建一个全局变量,而不是使用单例模式,并调用GetErrors()方法作为Main方法的第一个语句。但是我应该在哪里调用WPF应用程序中的GetErrors()方法?

1 个答案:

答案 0 :(得分:1)

将您的班级更改为static以确保其中的单个实例。

然后,您可以在显示的第一个表单的MyConfiguration.GetErrors()事件中调用Load并报告错误。

相关问题