2014/10/6

[Winform] 自訂 app.config 區段

在撰寫 Windows Form 程式時, 我們時常會在 app.config 中放入一些參數。如果把它們存放在 appSettings 區段中, 那麼我們就可以很方便地使用 ConfigurationManager.AppSettings["MyKey"] 取出。但是, 如果我們要放進去的資料稍為複雜一點, 操作起來就沒那麼直覺。例如, 我們可以將鍵值以 a-XXX, b-XXX 方式命名, 再使用字串處理方式分出群組。

一般而言, 我們通常不會在 app.config 中存入大量資料, 也不會存入太複雜的資料 (否則你應該使用更適合的格式檔案, 例如 XML 或 JSON), 更不會進行大量且持續的存取, 所以上述做法是 OK 的。然而, 如果你和我一樣有奇怪的潔癖, 或許你也會覺得上述做法有點 low。我們就是要去找最有彈性的做法 (明明就用不到)。XD

事實上我們對 App.config 的掌控度是很高的, 只是我們平常用不到而已。在 App.config 檔案中, 除了我們常見的 connectionStrings、appSettings 等區段之外, 我們也可以自訂區段。一旦我們可以自訂區段, 我們就可以自由地在 App.config 中寫入任何資料, 彈性極大。

首先, 我們必須先在 App.config 裡的 configuration.configSections 區段中定義自訂區段的名稱。方法如下:

<configuration>
  <configSections>
    <section name="CarTypes" type="System.Configuration.AppSettingsSection, 
    System.Configuration, Version=4.0.0.0, Culture=neutral, 
    PublicKeyToken=b03f5f7f11d50a3a" />    
  </configSections>
  ...

在這裡, 我們建立了一個叫做 "CarTypes" 的區段名稱。除了這個名稱可以自訂之外, 其它指令都照上面的樣子打進去就對了。

如果你的專案中已經裝上 Entity Framework 的話, 那麼你應該可以注意到, 事實上 Entity Framework 也是依照相同做法自訂了一個 "entityFramework" 區段:

<configuration>
  <configSections>
    <section name="entityFramework" 
    type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, 
    EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    requirePermission="false" />    
  </configSections>
  ...

以上, 包括 AppSettingsSection 型別和 EntityFrameworkSection 型別, 同樣都繼承自 System.Configuration.ConfigurationSection 型別。所以我說他們使用的是同一種做法。至於到底 AppSettingsSection 型別後面跟著的那一串版號和 PublicKeyToken 都是從哪裡來的呢? 我們可以從 Visual Studio 的方案總管中, 在「參考」子目錄下找到對應的組件, 然後從屬性中找到它的版本和所在資料夾位置。

然後, 我們可以使用 .NET Framework Strong Name Utility 以找出特定組件的 PublicKeyToken。方法如下:

  1. 開啟「開發人員命令提示字元」
  2. 找到並切換到組件所在資料夾 (我另外以 EntityFramework.dll 為例, 它會放置在專案的 bin/Debug 或 bin/Release 資料夾之下)
  3. 執行 "sn -T 組件名稱" (請注意 "T" 必須為大寫)

執行結果如下圖所示:

System.Configuration.dll 和其它組件也是依照相同方法。

定義自訂區段名稱之後, 我們就可以在 App.config 檔案中自由地把這個區段加上去了:

<CarTypes>
  <add key="Car" value="轎車"/>
  <add key="Van" value="廂型車"/>
  <add key="Minivan" value="麵包車"/>
  <add key="MPV" value="多功能休旅車"/>
  <add key="CrossOver" value="跨界休旅車"/>
  <add key="SUV" value="運動休旅車"/>
  <add key="EV" value="電動車"/>
  <add key="Hybrid" value="油電混合車"/>
  <add key="Truck" value="卡車"/>
</CarTypes>

要在程式中把定義在此的資訊取出, 可以使用以下程式:

NameValueCollection carTypes = (NameValueCollection)ConfigurationManager.GetSection("CarTypes");
foreach (string key in carTypes) // Car、Van、Minivan...
{
   lbTest.Text += carTypes[key]; // 轎車、廂型車、麵包車...
}

依此方式, 我們就可以在 app.config 中自由建立多個區段了。

沒有留言:

張貼留言