.NET Framework在web.config或app.config中默认提供了很多种设置,以便能够改变应用程序内嵌组件的行为,例如<connectionStrings>、<httpHandlers>、<sessionState>等等,这对于常规情况下的一般程序员而言是足够用的,也是非常方便的。但是我们越来越多地发现需要自己来控制一系列设置的集合 - 有时是面向组件的(自定义的或第三方提供的),有时是应用程序中使用的一系列值的集合。

  .config虽然默认提供了自定义设置(在<appSettings/>节点下),但是它太弱了,仅仅只支持键值对(key/value)

<add key="myKey" value="myValue"/>

  虽然键值对在大多数情况下也是很有帮助的,但是它对于健壮的组件、复杂的设置而言是不够灵活的,甚至显得过于简单。幸运的是,微软为我们提供了一种以编程的方式来访问自定义的配置/设置。

一、The Configuration Section

  先看如下的配置设置,含义很明确:定义一些rss,有名字、地址、以及是否缓存

  <feedRetriever>
<feeds>
<add name="cnblogs" url="http://www.cnblogs.com/rss/" />
<add name="CoolShell" url="http://coolshell.cn/rss/" cache="false" />
</feeds>
</feedRetriever>

  接下来我们就以代码来展示如何调用

二、Writing the Configuration Handler

1. Representing the <add/> Element

  每一个ConfigurationElement对象都是作为其内部属性(properties)集合的索引器而存在,再通过.NET提供了另一个属性(Attribute)-- 从而使得<add/>(.config中的自定义节点,取名add完全是基于微软是如此命名故为保持一致而为之)节点的attributes与FeedElement的properties进行关联(map),具体代码如下

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web; namespace WebAppCustomConfiguration
{
public class FeedElement : ConfigurationElement
{
[ConfigurationProperty("name", IsKey = true, IsRequired = true)]
public string Name
{
get { return (string)this["name"]; }
set { }
} [ConfigurationProperty("url", IsRequired = true, DefaultValue = "http://localhost")]
[RegexStringValidator(@"http?\://\S+")]
public string Url
{
get { return (string)this["url"]; }
set { }
} [ConfigurationProperty("cache", IsRequired = false, DefaultValue = true)]
public bool Cache
{
get { return (bool)this["cache"]; }
set { }
}
}
}

The following list is a complete list of possible parameters:

  • DefaultValue – Gets or sets the default value for the decorated property. This parameter is not required.
  • IsDefaultCollection – Gets or a sets a Boolean value indicating whether the property is the default property collection for the decorated property. This parameter is not required, and the default is false.
  • IsKey – Gets or sets a Boolean value indicating whether this property is a key property for the decorated element property. This parameter is not required, and its default value is false.
  • IsRequired – Gets or sets a Boolean value indicating whether the decorated element property is required. This parameter is not required, and its default value is false.

2. Writing an Element Collection Class

  类ConfigurationElementCollection包含有好几个成员,但是只有两个标记为abstract,所以最简单的ConfigurationElementCollection只需实现这两个方法

  • CreateNewElement() – 创建一个新的ConfigurationElement对象(本例而言就是FeedElement);
  • GetElementKey() – 获得指定配置节点的key (本例而言就是FeedElement的Name属性(property).
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web; namespace WebAppCustomConfiguration
{
[ConfigurationCollection(typeof(FeedElement))]
public class FeedElementCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new FeedElement();
} protected override object GetElementKey(ConfigurationElement element)
{
return ((FeedElement)element).Name;
}
}
}

3. Writing the FeedRetreiverSection Class

  此Class较为简单,只需编程实现能够访问<feeds />节点即可,具体而言就是一属性(Property)

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web; namespace WebAppCustomConfiguration
{
public class FeedRetrieverSection : ConfigurationSection
{
[ConfigurationProperty("feeds", IsDefaultCollection = true)]
public FeedElementCollection Feeds
{
get { return (FeedElementCollection)this["feeds"]; }
set { }
}
}
}

4. Modifying web.config

  下面的配置就不说了

<section name="feedRetriever" type="WebAppCustomConfiguration.FeedRetrieverSection"/>

5. Accessing Configuration Data from Code

  调用的代码如下,简单不解释

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Web; namespace WebAppCustomConfiguration
{
public class FeedRetriever
{
public static FeedRetrieverSection _Config = ConfigurationManager.GetSection("feedRetriever") as FeedRetrieverSection; public static void GetFeeds()
{
foreach (FeedElement feedElement in _Config.Feeds)
{
// make request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(feedElement.Url);
WebProxy proxy = new WebProxy("ip address:port", true);
proxy.Credentials = new NetworkCredential("username", "password", "domain");
request.Proxy = proxy;
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK)
{
string feedData = String.Empty; using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
feedData = reader.ReadToEnd();
} if (feedElement.Cache)
{
// filename of cache file
string filename = String.Format("{0}_{1}.xml", feedElement.Name, DateTime.Now.Ticks); // cache file
using (StreamWriter writer = new StreamWriter(@"D:\Deployment\Result\" + filename))
{
writer.Write(feedData);
}
}
}
}
}
}
}

.NET中如何自定义配置节点的更多相关文章

  1. [转]通过继承ConfigurationSection,在web.config中增加自定义配置

    本文转自:http://www.blue1000.com/bkhtml/2008-02/55810.htm 前几天写了一篇使用IConfigurationSectionHandler在web.conf ...

  2. VS2012 常用web.config配置解析之自定义配置节点

    在web.config文件中拥有一个用户自定义配置节点configSections,这个节点可以方便用户在web.config中随意的添加配置节点,让程序更加灵活(主要用于第三方插件的配置使用) 自定 ...

  3. App.config和Web.config配置文件的自定义配置节点

    前言 昨天修改代码发现了一个问题,由于自己要在WCF服务接口中添加了一个方法,那么在相应调用的地方进行更新服务就可以了,不料意外发生了,竟然无法更新.左查右查终于发现了问题.App.config配置文 ...

  4. ASP.NET系列:自定义配置节点的复用

    appSettings太简单,为每个程序自定义配置节点太复杂,因此要解决app.config&web.config自定义配置的复用问题. 1.读取不依赖SectionName,根节点可以定义为 ...

  5. 自定义配置节点configSections的使用

    //App.config <?xml version="1.0" encoding="utf-8" ?><configuration>  ...

  6. asp.net中web.config配置节点大全详解

    最近网上找了一些关于Web.config配置节点的文章,发现很多都写的都比较零散,而且很少有说明各个配置节点的作用和用法.搜索了一下发现有一篇写的不错,这里引用一下 原文地址 http://www.c ...

  7. .Net 配置文件--继承ConfigurationSection实现自定义处理类处理自定义配置节点

    除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个 ...

  8. .Net 配置文件——继承ConfigurationSection实现自定义处理类处理自定义配置节点

    除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个 ...

  9. asp.net中web.config配置节点大全详解【转】

    web.config 文件查找规则: (1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找. (2)如果当前页面所在目录下不存在web ...

随机推荐

  1. 清理elasticsearch的索引

    curl -XDELETE 'http://172.16.1.16:9200/logstash-2013.03.*' 清理掉了所有 3月份的索引文件,其中*是通配符 下面是主页上的详细介绍,其他部分可 ...

  2. 内存映像分析工具Eclipse Memory Analyzer

    1. Eclipse Memory Analyzer安装 Help ->Eclipse Marketplace,搜索Memory,点击install,->confirm->同意证书内 ...

  3. ReentrantLock详解 以及与synchronized的区别

    ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁 ReentrantLock lock = new ReentrantLock(tr ...

  4. Go 示例测试实现原理剖析

    简介 示例测试相对于单元测试和性能测试来说,其实现机制比较简单.它没有复杂的数据结构,也不需要额外的流程控制,其核心工作原理在于收集测试过程中的打印日志,然后与期望字符串做比较,最后得出是否一致的报告 ...

  5. 【XSY1841】Intervals

    Description 在一个长度为m的序列中选出n个区间,这些区间互不包含,且至少有一个区间的左端点为x. 问有多少种方案,注意交换两个区间的顺序视为不同方案. ​ 答案很大,输出模10000000 ...

  6. java整形中的缓存机制

      英文原文:Java Integer Cache 翻译地址:Java中整型的缓存机制 原文作者:Java Papers 翻译作者:Hollis 转载请注明出处. 本文将介绍Java中Integer的 ...

  7. Qt 编写多窗口程序

    该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语      程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭 ...

  8. dingo 内部调用获取异常信息

    $exception->getResponse(); $params = [ 'company_id' => $this->request->input('company_id ...

  9. error: Failed to start domain lb error: Failed to activate service 'org.freedesktop.machine1': timed out 报错的解决办法

    能正常查看kvm虚拟机列表: virsh list 但在执行virsh start lb启动虚拟机时卡顿了好几秒,然后报以下错误: error: Failed to start domain lber ...

  10. GO_09:GO语言基础之reflect反射

    反射reflection 1. 反射可以大大的提高程序的灵活性,使得 interface{} 有更大的发挥余地 2. 反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息 3. 反 ...