天天看點

在.net中使用強類型來讀取配置資訊

在.net應用中,配置資訊以XML文檔的形式來存儲。依.net的慣例,web.config為Asp.net應用(包括Web Service應用)提供配置資訊;而*.exe.config為可執行的應用(包括控制台、Windows服務、Windows桌面應用程式)提供配置資訊,其中的“*”代表易用的程式集名稱,例如App.exe程式集的對應配置檔案為App.exe.config。

1、使用預設方法讀取

    在代碼中使用System.Configuration名稱空間中的ConfigurationManager即可友善地對配置進行讀取(1.1版使用ConfigurationSettings),比如,用如下代碼就可以讀取一條配置資訊:

在.net中使用強類型來讀取配置資訊

string portNumber = ConfigurationManager.AppSettings["PortNumber"];

    這段代碼讀取配置檔案AppSetting段中的如下資訊:

在.net中使用強類型來讀取配置資訊

<appSettings>

在.net中使用強類型來讀取配置資訊

    <add key="PortNumber" value="4532"/>

在.net中使用強類型來讀取配置資訊

</appSettings>

    确實夠簡單,但是如果我的配置資訊更為複雜呢,比如說分為如下的層次:

在.net中使用強類型來讀取配置資訊

<Servers>

在.net中使用強類型來讀取配置資訊

    <DbServer>

在.net中使用強類型來讀取配置資訊

        <Address>10.1.1.1</Address>

在.net中使用強類型來讀取配置資訊

        <PortNumber>9797</PortNumber>

在.net中使用強類型來讀取配置資訊

    </DbServer>

在.net中使用強類型來讀取配置資訊

    <AppServer>

在.net中使用強類型來讀取配置資訊

        <Address>10.1.1.2</Address>

在.net中使用強類型來讀取配置資訊

        <PortNumber>5203</PortNumber>

在.net中使用強類型來讀取配置資訊

    </AppServer>

在.net中使用強類型來讀取配置資訊

</Servers>

    那邊某君回答:“這照樣可以一字排開啊”--那麼層次更加複雜的呢?嘿嘿,沒招了吧。當然有招,我們可以建立強類型的讀取類來處理,任你多麼複雜也不在話下,哼哼。

2、使用強類型來讀取

    在.net中,配置檔案中的所有資訊都經由IconfigurationSectionHandler接口讀出。該接口隻有一個方法:

在.net中使用強類型來讀取配置資訊

object Create (object parent, object configContext, XmlNode section)

    通過這個方法,IconfigurationSectionHandler接口讀取資訊并把它們轉換成程式易于使用的形式。

    首先讓我們來看一個簡單的配置檔案:

在.net中使用強類型來讀取配置資訊

<?xml version="1.0" encoding="utf-8" ?>

在.net中使用強類型來讀取配置資訊

<configuration>

在.net中使用強類型來讀取配置資訊

    <configSections>

在.net中使用強類型來讀取配置資訊

        <section name="DbServer" type=""/>

在.net中使用強類型來讀取配置資訊

        <section name="AppServer" type=""/>

在.net中使用強類型來讀取配置資訊

    </configSections>

在.net中使用強類型來讀取配置資訊

<!--上面是段處理器部分-->

在.net中使用強類型來讀取配置資訊

<!--下面是段内容部分-->

在.net中使用強類型來讀取配置資訊

    <appSettings>

在.net中使用強類型來讀取配置資訊

        <add key="PortNumber" value="4532"/>

在.net中使用強類型來讀取配置資訊

    </appSettings>

在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊

          <Address>10.1.1.1</Address>

在.net中使用強類型來讀取配置資訊

          <PortNumber>9797</PortNumber>

在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊

          <Addr>10.1.1.2</Addr>

在.net中使用強類型來讀取配置資訊

          <Port>5203</Port>

在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊

</configuration>

    如上面所示,除根節點(<configuration>)外,配置資料分為兩部分:段處理器(section handler,指節點<configSections>中的所有内容)部分和段内容(section,除<configSections>節點外的内容)部分。

    段處理器部分為給段的内容制定相應的資料處理類,即在<section>節點中,type屬性描述的類(前面為包括名稱空間的類名,後面為程式集名,使用逗号分隔)被指定用于處理name屬性描述的段内容。

    那麼,段處理器如何處理相應段的内容呢?原來,<configSections>定義的每一個處理器類都必須實作IconfigurationSectionHandler接口,當執行下列代碼時,CLR将通過兩個步驟獲得一個處理器:

在.net中使用強類型來讀取配置資訊

object DbServerConfig = ConfigurationManager.GetSection("DbServer");

    首先,CLR在配置檔案的段處理器部分找到與“DbServer”相應的段處理器描述,并通過反射機制建立一個處理器對象;然後調用處理器對象的Create方法并傳入3個參數,其中第3個參數包含了該段内容的XML資訊(在我們的例子中就是DbServer節點下的所有内容),然後傳回Create的傳回值。

    那我們這就是建立一個簡單的段處理器類吧

在.net中使用強類型來讀取配置資訊

using System;

在.net中使用強類型來讀取配置資訊

using System.Configuration;

在.net中使用強類型來讀取配置資訊

using System.Xml;

在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊

namespace SimpleConfig

在.net中使用強類型來讀取配置資訊

{

在.net中使用強類型來讀取配置資訊

    public class DbServerConfig : IConfigurationSectionHandler

在.net中使用強類型來讀取配置資訊

    {

在.net中使用強類型來讀取配置資訊

        private string address;

在.net中使用強類型來讀取配置資訊

        public string Address

在.net中使用強類型來讀取配置資訊

        {

在.net中使用強類型來讀取配置資訊

            get { return address; }

在.net中使用強類型來讀取配置資訊

        }

在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊

        private int portNumber;

在.net中使用強類型來讀取配置資訊

        public int PortNumber

在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊

            get { return portNumber; }

在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊

        public object Create(object parent, object configContext, XmlNode section)

在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊

            foreach (XmlNode node in section.ChildNodes)

在.net中使用強類型來讀取配置資訊

            {

在.net中使用強類型來讀取配置資訊

                switch (node.Name)

在.net中使用強類型來讀取配置資訊

                {

在.net中使用強類型來讀取配置資訊

                    case "Address": address = node.InnerText; break;

在.net中使用強類型來讀取配置資訊

                    case "PortNumber": portNumber = Convert.ToInt32(node.InnerText); break;

在.net中使用強類型來讀取配置資訊

                }

在.net中使用強類型來讀取配置資訊

            }

在.net中使用強類型來讀取配置資訊

            return this;

在.net中使用強類型來讀取配置資訊
在.net中使用強類型來讀取配置資訊

    }

在.net中使用強類型來讀取配置資訊

}

在.net中使用強類型來讀取配置資訊

    接着,把段處理器部分的

在.net中使用強類型來讀取配置資訊

<section name="DbServer" type=""/>

    改為

在.net中使用強類型來讀取配置資訊

<section name="DbServer" type="SimpleConfig.DbServerConfig, SimpleConfig"/>

    就可以使用下面的語句來讀取配置檔案中的内容了:

在.net中使用強類型來讀取配置資訊

object o = ConfigurationManager.GetSection("DbServer");

在.net中使用強類型來讀取配置資訊

DbServerConfig dbServerConfig = (DbServerConfig)o;

在.net中使用強類型來讀取配置資訊

textBox1.Text = dbServerConfig.Address;

在.net中使用強類型來讀取配置資訊

textBox2.Text = dbServerConfig.PortNumber.ToString();

本文轉自高海東部落格園部落格,原文連結:http://www.cnblogs.com/ghd258/archive/2005/11/27/285580.html,如需轉載請自行聯系原作者