• ConfigurationSection类使用心得


    ConfigurationSection类主要是方便我们用于扩展自定义webcongfig中的节点信息。我们可以方便的通过以下方式获取【自定义节点对象】

    【你自定义的对象】 config = (【你自定义的对象】)ConfigurationManager.GetSection("【你自定义的节点名称,如果是sectiongroup的话,请使用XPATH方式】");

    使用自定义节点,可能会涉及到这几个对象的使用:ConfigurationSection【配置域】、ConfigurationElement【节点】、ConfigurationElementCollection【节点列表】

    用法一: 配置如下webconfig自定义信息,注意order和lineItem节点都是允许重复出现的 

    复制代码
     1<?xml version="1.0" encoding="utf-8" ?>
     2<configuration>
     3  <configSections>
     4    <section name="orders" type="ConsoleTest.OrdersSection, ConsoleTest"/>
     5  </configSections>
     6  <orders companyID="2001">
     7    <order number="100001" amount="222.22">
     8      <lineItems warehouseNumber="02">
     9        <lineItem number="00-000-001" description="wii"/>
    10      </lineItems>
    11    </order>
    12    <order number="300001" amount="33.33">
    13      <lineItems warehouseNumber="99">
    14        <lineItem number="00-000-001" description="xbox 360"/>
    15        <lineItem number="00-000-003" description="playstation 3"/>
    16      </lineItems>
    17    </order>
    18  </orders>
    19</configuration>
    复制代码

    下面我们要定义相应的实体对象,该实体对象中会有一个子对象【用来表示节点列表信息】(ConfigurationElementCollection)

    复制代码
        public class OrdersSection : ConfigurationSection
        {
            [ConfigurationProperty("companyID", IsRequired = true)]
            public string CompanyID
            {
                get
                {
                    return (string)base["companyID"];
                }
                set
                {
                    base["companyID"] = value;
                }
            }

            [ConfigurationProperty("", IsDefaultCollection = true)]
            public OrderElementCollection Orders
            {
                get
                {
                    return (OrderElementCollection)base[""];
                }
            }
        }
    复制代码

     接下来我们在看看节点列表对象的定义,其中会包含一个子对象【ConfigurationElementCollection】

    复制代码
        public class OrderElementCollection : ConfigurationElementCollection
        {
            protected override ConfigurationElement CreateNewElement()
            {
                return new OrderElement();
            }
            protected override object GetElementKey(ConfigurationElement element)
            {
                return ((OrderElement)element).Number;
            }

            public override ConfigurationElementCollectionType CollectionType
            {
                get
                {
                    return ConfigurationElementCollectionType.BasicMap;
                }
            }
            protected override string ElementName
            {
                get
                {
                    return "order";
                }
            }

            public OrderElement this[int index]
            {
                get
                {
                    return (OrderElement)BaseGet(index);
                }
                set
                {
                    if (BaseGet(index) != null)
                    {
                        BaseRemoveAt(index);
                    }
                    BaseAdd(index, value);
                }
            }
        }
    复制代码

     那么我们再看看节点对象的定义

    复制代码
        public class OrderElement : ConfigurationElement
        {
            [ConfigurationProperty("number", IsRequired = true)]
            public string Number
            {
                get
                {
                    return (string)base["number"];
                }
                set
                {
                    base["number"] = value;
                }
            }

            [ConfigurationProperty("amount", IsRequired = true)]
            public double Amount
            {
                get
                {
                    return (double)base["amount"];
                }
                set
                {
                    base["amount"] = value;
                }
            }

            [ConfigurationProperty("lineItems", IsDefaultCollection = true)]
            public LineItemElementCollection LineItems
            {
                get
                {
                    return (LineItemElementCollection)base["lineItems"];
                }
            }
        }
    复制代码

     另外,还有一个子节点列表对象需要定义,【LineItemElementCollection】(ConfigurationElementCollection)

    复制代码
        public class LineItemElementCollection : ConfigurationElementCollection
        {
            [ConfigurationProperty("warehouseNumber", IsRequired = true)]
            public string WarehouseNumber
            {
                get
                {
                    return (string)base["warehouseNumber"];
                }
                set
                {
                    base["warehouseNumber"] = value;
                }
            }

            protected override ConfigurationElement CreateNewElement()
            {
                return new LineItemElement();
            }
            protected override object GetElementKey(ConfigurationElement element)
            {
                return ( (LineItemElement)element ).Number;
            }

            public override ConfigurationElementCollectionType CollectionType
            {
                get
                {
                    return ConfigurationElementCollectionType.BasicMap;
                }
            }
            protected override string ElementName
            {
                get
                {
                    return "lineItem";
                }
            }

            public LineItemElement this[int index]
            {
                get
                {
                    return (LineItemElement)BaseGet(index);
                }
                set
                {
                    if (BaseGet(index) != null)
                    {
                        BaseRemoveAt(index);
                    }
                    BaseAdd(index, value);
                }
            }
        }
    复制代码

    当然我们还得再定义一个节点对象【LineItemElement

    复制代码
        public class LineItemElement : ConfigurationElement
        {
            [ConfigurationProperty("number", IsKey=true, IsRequired = true)]
            public string Number
            {
                get
                {
                    return (string)base["number"];
                }
                set
                {
                    base["number"] = value;
                }
            }

            [ConfigurationProperty("description", IsRequired = true)]
            public string Description
            {
                get
                {
                    return (string)base["description"];
                }
                set
                {
                    base["description"] = value;
                }
            }
        }
    复制代码

    这样我们就完成了webconfig节点的自定义和对象的实体化, 我们在使用的使用值需要简单的代码就能获取到相应对象的实体信息;如:

    OrdersSection  config = (OrdersSection)ConfigurationManager.GetSection("orders");

    另一中用法:sectionGroup 配置 。如要配置出如下webconfig信息

    复制代码
      <configSections>
        <sectionGroup name="mygroup">
          <section name="mysection"
                           type="ConfigSection"
                            allowDefinition="Everywhere"
                             allowLocation="true"/>
        </sectionGroup>
      </configSections>

      <mygroup>
        <mysection  user="用户" password="密码">
          <element element1="属性1" element2="属性2"></element>
        </mysection>
      </mygroup>
    复制代码

     那么我们看下实体是如何定义的 。

    复制代码
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    /// <summary>
    /// ConfigSection 的摘要说明
    /// </summary>
    public class ConfigSection:ConfigurationSection
    {
        public ConfigSection()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }
    [ConfigurationProperty("user",DefaultValue="yanghong",IsRequired=true)]
        public string User
        {
            get { return (string)this["user"]; }
            set { this["user"] = value; }
        }

        [ConfigurationProperty("password",DefaultValue="password",IsRequired=true)]
        public string PassWord
        {
            get {  return (string)this["password"]; }
            set { this["password"] = value; }
        }

        [ConfigurationProperty("element")]
        public elementinfo Element
        {
            get { return  (elementinfo)this["element"]; }
            set {this["element"] = value; }
        }
    }
    复制代码

     上面的实体对象包含一个节点对象信息,我们看下这个对象是如何定义的 。

    复制代码
    public class elementinfo : ConfigurationElement
    {
        public elementinfo()    { }


        [ConfigurationProperty("element1", DefaultValue = "element1", IsRequired = true)]
        public string Element1
        {
            get { return (string)this["element1"]; }
        }

        [ConfigurationProperty("element2",DefaultValue="element2",IsRequired=true)]
        public string Element2
        {
            get { return (string)this["element2"]; }
        }


    }
    复制代码

    代码的调用就相当简单了 :

        ConfigSection config = (ConfigSection)ConfigurationManager.GetSection("mygroup/mysection");
        Response.Write("用户名:"+config.User.ToString() + "密码:" + config.PassWord.ToString() + "元素属性:" + config.Element.Element1.ToString() + config.Element.Element2.ToString());
  • 相关阅读:
    VC++ 利用PDB和dump文件定位问题并进行调试
    MFC限制edit控件的字符输入长度
    VC++ 使用CreateProcess创建新进程
    正则表达式验证HTTP地址是否合法
    C++ _access和_waccess的使用方法
    最后一次谈 VirtualBox的安装方法
    解决/var/log下没有messages文件的问题?
    待续未完- 自己写后台内容管理程序的辅助内容
    php中的正则函数:正则匹配,正则替换,正则分割 所有的操作都不会影响原来的字符串.
    未完待续
  • 原文地址:https://www.cnblogs.com/sjqq/p/7619887.html
Copyright © 2020-2023  润新知