在撰寫 Windows Form 程式時, 我們時常會在 app.config 中放入一些參數。如果把它們存放在 appSettings 區段中, 那麼我們就可以很方便地使用 ConfigurationManager.AppSettings["MyKey"] 取出。但是, 如果我們要放進去的資料稍為複雜一點, 操作起來就沒那麼直覺。例如, 我們可以將鍵值以 a-XXX, b-XXX 方式命名, 再使用字串處理方式分出群組。一般而言, 我們通常不會在 app.config 中存入大量資料, 也不會存入太複雜的資料 (否則你應該使用更適合的格式檔案, 例如 XML 或 JSON), 更不會進行大量且持續的存取, 所以上述做法是 OK 的。然而, 如果你和我一樣有奇怪的潔癖, 或許你也會覺得上述做法有點 low。我們就是要去找最有彈性的做法 (明明就用不到)...
在撰寫 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。方法如下:
- 開啟「開發人員命令提示字元」
- 找到並切換到組件所在資料夾 (我另外以 EntityFramework.dll 為例, 它會放置在專案的 bin/Debug 或 bin/Release 資料夾之下)
- 執行 "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 中自由建立多個區段了。