IConfigurationSectionHandler接口也是大家讨论的比较多的接口之一,所以我在这也只能称为追追前人的尾巴,帮名为也谈.
实现该接口的用途或许大家都有些了解,主要是在配置文件中自点定配置节点.在web中有web.config,在win或者控制台程序中有
app.config.或者大家都使用过很多开源的框架,特别是一些IOC的项目,如:spring.net之类的.
当你使用他们的时候,需求一段的配置文件和XML文件,而配置文件节点中必有的<configSections></configSections>就是自定义节点的申明了.
下面引用一段spring.net的配置文件:
- <configuration>
- <configSections>
- <sectionGroup name="spring">
- <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
- <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
- </sectionGroup>
- </configSections>
- <spring>
- <context>
- <resource uri="config://spring/objects"/>
- </context>
-
- <objects xmlns="http://www.springframework.net">
- ...
- </objects>
- </spring>
- </configuration>
然而你或者想知道
<
section
name
=
"context"
type
=
"Spring.Context.Support.ContextHandler, Spring.Core"
/>这到底是什么?
这正是我们要求解的地方.因为在写此文的时候没有看过其他人的解说,所以内容皆为个人见解,不足之处还请拍砖.如有转载请注明作者和出处.谢谢.
IConfigurationSectionHandler正是处理上面让人感到疑惑的问题.
看看IConfigurationSectionHandler接口的定义:
- using System;
- using System.Xml;
- namespace System.Configuration
- {
-
-
- public interface IConfigurationSectionHandler
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- object Create(object parent, object configContext, XmlNode section);
- }
- }
该接口仅有一个方法,返回的是一个object.具体用处可以先来看看我们常用的在配置文件中设置数据库连接字符串的使用方法:
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Configuration;
- namespace Entity
- {
- public class Class1
- {
- private static ConnectionStringSettingsCollection col;
- static Class1()
- {
- try
- {
-
- Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- col = config.ConnectionStrings.ConnectionStrings;
- }
- catch
- {
- try
- {
-
- col = ConfigurationManager.ConnectionStrings;
- }
- catch (Exception ex)
- {
- throw new DataBaseException(ex.Message, ex);
- }
- }
- }
- }
- }
作为web开发的人员来说
ConfigurationManager.ConnectionStrings;这个正是常见到的,而我们也想通过
ConfigurationManager类或者Configuration类直接获取配置文件里面的信息,并根据里面的配置信息返回我们想要的类型的话那就是实现IConfigurationSectionHandler接口,实现该接口后使用方式为:
(以下以我将开源的Logger项目为示例代码)
- object obj=ConfigurationManager.GetSection("Galbanum/Logger");
下面看看我的接口实现的代码:
-
-
-
-
- public class LoggerHandler : IConfigurationSectionHandler
- {
-
- private static Dictionary<string, ILoggerStyle> dicLoggerStyle;
-
- static LoggerHandler()
- {
- dicLoggerStyle = new Dictionary<string, ILoggerStyle>();
- }
- #region IConfigurationSectionHandler 成员
-
- public object Create(object parent, object configContext, System.Xml.XmlNode section)
- {
- ILoggerStyle style = null;
- string key=string.Empty;
- string value=string.Empty;
- XmlNodeList nodes = section.SelectNodes("LoggerStyle");
- foreach (XmlNode n in nodes)
- {
- foreach (XmlAttribute att in n.Attributes)
- {
- if (att.Name == "key")
- key = att.Value;
- if (att.Name == "value")
- value = att.Value;
- }
- if (key != String.Empty && value != String.Empty)
- {
- style = LoggerStyleFactory.GetStyle(key, value);
- dicLoggerStyle.Add(key, style);
- }
- else
- {
- throw new LoggerException("配置文件Logger节点出错。");
- }
- }
- return dicLoggerStyle;
- }
- #endregion
- }
上面的代码应该是很简单的,再看看对应的配置文件:
- <configuration>
- <configSections>
- <sectionGroup name="Galbanum">
- <section name="Logger" type="Logger.LoggerHandler,Logger"/>
- </sectionGroup>
- </configSections>
- <Galbanum>
- <Logger>
- <LoggerStyle key="test" value="Entity.EntityStyle,Entity">
- </LoggerStyle>
- <LoggerStyle key="orm" value="Logger.OrmStyle,Logger">
- </LoggerStyle>
- </Logger>
- </Galbanum>
- </configuration>
再看看调用的方法:
- private Dictionary<string, ILoggerStyle> dicStyle=ConfigurationManager.GetSection("Galbanum/Logger") as Dictionary<string,ILoggerStyle> ;
即你在你的项目的配置文件中配置上面的信息,在任何地址使用
=ConfigurationManager.GetSection(
"Galbanum/Logger"
)即可获取
接口中Create()方法的返回值
return
dicLoggerStyle;
很是不错吧?在网站项目和控制台或者应用程序项目中使用方式竟然是一样的,强大啊,在微软自己定义的Configuration节点中经常是web.config和app.config获取的方法是不相同的.而且返回的是一个object,一个类型转换就到了你想要的类型.如果你真的想强大一些的话你甚至可以自定义一个你自己的Configuration,哈哈,快去试试啊.
以上内容纯个人见解,如有误导敬请原谅。