在.Net应用程序中,我们经常看到VS为我们生成的项目工程中都会含有nfig或者nfig这样的文件。这个文件就是我们所说的应用程序配置文件。在这个文件里面记述着一些与我们的应用程序相关的信息,如:数据库连接,认证模式等。我们在程序中可以利用ConfigurationManager的ConnectionStrings属性方便的获取配置文件中的数据库连接字符串信息。

  可是有时候,我们需要对它进行一些扩展,加入一些自定义的元素,而不是仅仅使用默认的配置。例如,我们可能需要在程序启动时,动态的加载某个类,并对其进行初始化,而这个类或者初始化数据是我们在程序设计的时候所不知道的。相信大家都碰到过这样的问题,这里就不做过多的解释了。最好的办法无非就是把这些可能会改变的东西写进配置文件里面,到你能够确定的时候,你只需要修改配置文件就Ok了,而不是产品马上上线的时候还用30秒钟打开VS去改代码。

  添加一些自定义的元素到配置文件中是很容易的,只需要两步就能搞定:

  1. 在<configSections>节点中注册你所要定义的节点名称及用于处理该节点的配置节处理程序。代码如下:

    <configSections>
<section name="dbFactory" type="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration"/>
</configSections>

  

  2. 在适当的位置添加自定义的节点。代码如下:

    <configSections>
<section name="dbFactory" type="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration"/>
</configSections> <dbFactory>
<default factory="sql"></default>
<factorys>
<add name="sql" assembly="Hello.Data" class="SqlDbFactory" />
<add name="oracle" assembly="Hello.Data" class="OracleDbFactory" />  
</factorys>
</dbFactory>

  自定义节点算是添加完了,可是我们怎么在程序里面获取这些配置信息呢?相信大家很多都是玩XML的高手,用System.Xml下的一些类写个XML的解析类,把我们自定义的节点信息解析出来,不就得到我们想要的东西了吗?的确是这样,大牛果然是大牛,小弟实在是佩服。可是如果用这种方式来实现的话,小弟就实在没有必要写这篇博文了。

  .Net框架为我们实现了很多的配置API,来简化我们对配置文件的操作。在第一个步骤中,我们提到了配置节处理程序,这个程序就是用来读写我们自定义的节点信息的。那么我们又如何来实现一个配置节处理程序呢?首先我们来了解一下相关的类和概念。

  ConfigurationSection:自定义节点都要继承该类,以提供对自定义配置节的自定义处理和编程访问。

  ConfigurationElement:它表示配置文件内的一个元素。

  ConfigurationElementCollection:它表示包含一个子元素集合的配置元素。

  有了这些类,我们可以归纳起来配置文件中有两种类型的配置元素。

  第一,单一型配置元素,即继承于ConfigurationElement的元素,它不包含任何子元素。

  第二,集合型配置元素,即继承于ConfigurationElementCollection德元素,它包含一个子元素集合。

  概念往往都比较抽象,要搞清楚这些东西,我们还是结合我们上面给的例子来具体说明一下。

  在<dbFactory> 配置节中有两个元素,即<default>和<factorys>,而<factorys>元素又包含了两个子元素。那么在这里<default>就是单一型配置元素,而<factorys>就是集合型配置元素。我们需要分别实现与这些元素相对应的类及其属性。

  <default>元素:它是一个单一型的元素,所以我们继承ConfigurationElement。该元素中有一个factory属性,那么我们在类中进行相应的定义。代码如下:

  代码

  

    public class DefaultElement : ConfigurationElement
{
[ConfigurationProperty("factory")]
public string Factory
{
get
{
return this["factory"] as string;
}
set
{
this["factory"] = value;
}
}
}

  注意:在属性定义上面我们需要注册该属性的ConfigurationProperty特性。

  <factorys>子元素:

  代码

  

public class FactoryElement : ConfigurationElement
{
[ConfigurationProperty("name")]
public string Name
{
get
{
return this["name"] as string;
}
set
{
this["name"] = value;
}
} [ConfigurationProperty("assembly")]
public string Assembly
{
get
{
return this["assembly"] as string;
}
set
{
this["assembly"] = value;
}
} [ConfigurationProperty("class")]
public string Class
{
get
{
return this["class"] as string;
}
set
{
this["class"] = value;
}
}
}

  <factorys>元素是集合型元素,继承ConfigurationElementCollection。

  代码

  

public class FactoryElements : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new FactoryElement();
} protected override object GetElementKey(ConfigurationElement element)
{
return ((FactoryElement)element).Name;
} public FactoryElement this[string name]
{
get
{
return BaseGet(name) as FactoryElement;
}
}
}

  ConfigurationElementCollection类是个抽象类,你应该显示的实现它的CreateNewElement方法和GetElementKey方法。

  <dbFactory>节点,继承于ConfigurationSection

  代码

  

public class DbFactorySection : ConfigurationSection
{
[ConfigurationProperty("default")]
public DefaultElement DefaultFactory
{
get
{
return this["default"] as DefaultElement;
}
set
{
this["default"] = value;
}
} [ConfigurationProperty("factorys")]
public FactoryElements Factorys
{
get
{
return this["factorys"] as FactoryElements;
} set
{
this["factorys"] = value;
}
}
}

  配置节处理程序终于写完了,把这四个类放在同一个工程目录下,编译成一个DLL。在你需要获取配置信息的地方,引用这个DLL,用DbFactorySection section = ConfigurationManager.GetSection( "dbFactory" ) as DbFactorySection;试试,section是不是你想要的东西呢?

C#创建自定义配置节的更多相关文章

  1. 使用 ConfigurationSection 创建自定义配置节

    我们可以通过用自己的 XML 配置元素来扩展标准的 ASP.NET 配置设置集,要完成这一功能,我们必须实现继承System.Configuration.ConfigurationSection 类来 ...

  2. ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节集合

    核心代码 using System; using System.Data; using System.Configuration; using System.Web; using System.Web ...

  3. ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节

    主要代码,一定要继续System.Configuration.ConfigurationSection,具体的节点名称可以自行修改 using System; using System.Data; u ...

  4. C#如何使用和开发自定义配置节

    在日常的程序设计中,如何灵活和巧妙地运用配置信息是一个成功的设计师的首要选择.这不仅是为了程序设计得更灵活性和可扩展性,也是为了让你的代码给人以清新的感觉.程序中的配置信息一般放在应用程序的app.c ...

  5. C#创建自定义配置节点

    转载:http://www.educity.cn/develop/495003.html 在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfi ...

  6. C# 创建自定义配置节点1

    转载:http://www.educity.cn/develop/495003.html 在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfi ...

  7. 迁移appseting.json创建自定义配置中心

    创建一个自定义的配置中心,将框架中各类配置,迁移至数据库,支持切换数据库,热重载. 说在前面的话 自使用.net Core框架以来,配置大多存在json文件中: [框架默认加载配置]文件为appset ...

  8. C# App.config 自定义 配置节

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

  9. C# App.config 自定义 配置节 报错“配置系统未能初始化” 解决方法

    App.config,结果运行的时候出现了 "配置系统未能初始化" 的错误.找了半天才发现是下面的原因造成的: "如果配置文件中包含configSections元素,则c ...

随机推荐

  1. nodejs express 框架解密4-路由

    本文档是基于express3.4.6 express 的路由是自己去实现的,没有使用connect中的路由中间件模块. 1.在如何创建一个app那篇中,我们提到了路由, //router //路由 t ...

  2. DataTable 排序

    DataTable newdtb = new DataTable(); newdtb.Columns.Add("Id", typeof(int)); newdtb.Columns. ...

  3. 2.C#自定义Attribute

    阅读目录    一:C#自定义Attribute    二:AttributeUsageAttribute中的3个属性(Property)中的AttributeTargets   三:Attribut ...

  4. IOS RSA 加密方式

    采用RSA加密方式,主要是生成公钥和私钥,公钥用来加密,私钥用来解密,至于其中如何实现的,网上有很多原理. 参见如下: https://github.com/jslim89/RSA-objc PS: ...

  5. 表格类似Excel

    只是很简单的实现表格,使用GridView控件-->可以上下左右滚动,但是不能合并 直接上代码: 1.主要布局 <?xml version="1.0" encoding ...

  6. System.Diagnostics.Stopwatch

    System.Diagnostics.Stopwatch 注意:此类在 .NET Framework 2.0 版中是新增的.MSDN Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量 ...

  7. 【总结】编写自己的JDBC框架

    一.数据库连接池: 在一般用JDBC 进行连接数据库进行CRUD操作时,每一次都会: 通过:java.sql.Connection conn = DriverManager.getConnection ...

  8. boost 1.56.0 编译及使用

    boost的编译和使用,经过搜集资料和总结,记录成文.感谢文后所列参考资料的作者. 1 下载 地址:http://sourceforge.net/projects/boost/files/boost/ ...

  9. 正则表达式工具RegexBuddy使用教程(原创自Zjmainstay)

    从<我眼里的正则表达式(入门)>这个文章,到<深入正则表达式应用>,再到后来专门创建的正则QQ群"专精正则表达式",到现在已经过去2年时间了.在文章和群里一 ...

  10. PSAM卡与CPU(用户卡)的操作过程

    最近我一直在研究关于通过国密PSAM卡作为安全模块来读写cpu(用户卡)的问题 其实,两者都是卡片,或者说都是从设备.它们之间是无法相互访问的. 实际上,PSAM 卡是作为秘密密钥的载体,专门执行加密 ...