// ================================================================================
// File: AppConfig.cs
// Desc: 配置文件的读取。读取web.config,app.config等配置文件的内容。
//
// Called by:
//
// Auth: 汪洋
// Date: 2010年8月20日
// ================================================================================
// Change History
// ================================================================================
// Date: Author: Description:
// -------- -------- -------------------
//
// ================================================================================
// Copyright (C) 2010-2012
// ================================================================================
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Reflection;
using System.Xml;
using System.IO;
using System.Configuration;
namespace xiaoy.Excel
{
///
/// 系统配置类,获取系统配置的配置参数
/// 此类实现了IConfigurationSectionHandler接口
///
public class AppConfig : System.Configuration.IConfigurationSectionHandler
{
#region 私有变量
string m_strSectionName;
///
/// 设置应用系统配置段,在各应用系统中实例化。
///
NameValueCollection m_configValues;
static NameValueCollection m_configApp;
#endregion
#region 构造函数
///
/// 初始化 AppConfiguration 类的新实例。
///
public AppConfig()
: this(null)
{
}
///
/// 初始化 AppConfiguration 类的新实例。
///
/// 默认读取的段的名称。
public AppConfig(string sectionName)
{
m_strSectionName = sectionName;
}
#endregion
#region 属性
///
/// 获取或设置配置段名。
///
protected virtual string SectionName
{
get
{
return m_strSectionName;
}
set
{
m_strSectionName = value;
}
}
///
/// 获取appSettings配置段里的内容。
///
public static NameValueCollection AppSettings
{
get
{
if (m_configApp == null)
{
m_configApp = new NameValueCollection();
//NameValueCollection v = (NameValueCollection)ConfigurationSettings.AppSettings;
KeyValueConfigurationCollection v=GetDllConfiguration().AppSettings.Settings;
if (v != null)
{
foreach (string key in v.AllKeys)
{
m_configApp.Set(key, v[key].Value);
}
}
}
return m_configApp;
}
}
///
/// 获取或设置用户指定配置段里的内容和默认内容的并集(默认为appSettings里的内容)。
///
public virtual NameValueCollection ModuleConfigSettings
{
get
{
if (m_configValues == null)
{
m_configValues = new NameValueCollection();
//添加AppSetting配置
m_configValues.Add(AppSettings);
if (SectionName != null && !SectionName.Equals(string.Empty))
{
NameValueCollection nv = GetConfig(SectionName);
//当模块配置不为空时,添加模块配置
if (nv != null)
{
//模块配置可以覆盖AppSetting中的配置
foreach (string key in nv.Keys)
{
m_configValues.Set(key, nv[key]);
}
}
}
}
return m_configValues;
}
set
{
m_configValues = value;
}
}
///
/// 封装多一遍, 确保调用本方法的方法为Dll内部方法, 从而取得正确的Dll配置文件路径
/// 否则可能取得的是执行程序(主程序)的路径
///
private static string DllConfigFilePath
{
get
{
Assembly t_assembly = Assembly.GetCallingAssembly();
Uri t_uri = new Uri(Path.GetDirectoryName(t_assembly.CodeBase));
return Path.Combine(t_uri.LocalPath, t_assembly.GetName().Name + ".config");
}
}
#endregion
#region 方法
///
/// 获取某段配置中的配置信息(为名称值的配置段)。
///
/// 配置段的名称Z
/// 配置段中的名称值对。
public static NameValueCollection GetConfig(string sectionName)
{
NameValueCollection values = null;
try
{
values = new NameValueCollection();
ConfigurationSection cs = GetDllConfiguration().GetSection(sectionName);
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(cs.SectionInformation.GetRawXml());
XmlNode xList = xDoc.ChildNodes[0];
foreach (XmlNode xNode in xList.ChildNodes)
{
if (xNode.NodeType == XmlNodeType.Element)
{
values.Add(xNode.Attributes[0].Value, xNode.Attributes[1].Value);
}
}
}
catch
{
values = new NameValueCollection();
}
return values;
}
///
/// 获取dll对应的配置
///
///
///
private static Configuration GetDllConfiguration()
{
string configFile = DllConfigFilePath;
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename=configFile;
return ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
}
#endregion
#region IConfigurationSectionHandler 成员
///
/// 创建新的配置处理程序并将其添加到节处理程序集合中。
///
/// 对应父配置节中的配置设置。
/// 配置节处理程序为其计算配置值的虚拟路径。通常,该参数是保留参数,并为空引用(Visual Basic 中为 Nothing)。
/// 包含要处理的配置信息的 XmlNode。提供对配置节 XML 内容的直接访问。
/// 一个 NameValueCollection。
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
NameValueSectionHandler handler = new NameValueSectionHandler();
return handler.Create(parent, configContext, section);
}
#endregion
}
}