簡體   English   中英

如何在應用程序啟動時加載配置?

[英]How to load the configuration on application startup?

我創建了一個配置文件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()方法允許獲取加載配置參數期間發生的錯誤列表:可能會通知用戶這些錯誤,並且可能會通知用戶應用程序已使用參數的默認值。

  1. 如何確保在應用程序啟動期間首先實例化此類?
  2. 我可以將單例模式應用於此類:這樣,我應該只調用Instance屬性作為Main方法的第一條語句。 但是我應該在WPF應用程序中的哪里調用Instance屬性?
  3. 可以不使用單例模式,而可以為MyConfiguration類創建一個全局變量,並調用GetErrors()方法作為Main方法的第一條語句。 但是我應該在WPF應用程序中的哪里調用GetErrors()方法?

將您的類更改為static以確保它的單個實例。

然后,您可以在顯示並報告錯誤的第一個表單的Load事件中調用MyConfiguration.GetErrors()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM