需求:最近老板要求将Regex正则表达式配置到一个单独的config文件中,不放在AppSetting.config中;
从网上找了很多关于自定义的文章,很多都尝试过,写的乱七八糟,最终选择下方较好的链接文章;
参考文章:https://www.cnblogs.com/len0031/p/7571594.html
本文通过参考上方链接,然后在本地进行测试,成功
实现过程:
在Web.config文件中添加设置自定义的数据结构,通过指定NewConfig文件路径加载配置文件,具体如下:
<configSections>
<!--把Framework节点的数据映射到ConfigFile类中-->
<!--这里需要注意命名空间是生成DLL的名称;RegexHelper为自定义的类名-->
<section name="RegexKeyValue" type="命名空间.RegexHelper,命名空间"/>
</configSections>
<!--自定义配置节点-->
<RegexKeyValue configSource="RegexSettings.config"/><!--我这里把新建的RegexSetting.config放到了Web.config同路径下-->
自定义的RegexSettings.Config文件结构如下:
<RegexKeyValue><!--这里在编译的时候可能会存在waring,不用管他;去除其他不必要的节点,保留下面即可-->
<Configs>
<add key="abcRegex" value="正则1"/>
<add key="ABCRegex" value="正则2"/>
</Configs>
</RegexKeyValue>
节点不再是key-value形式的,而是完全自定义的结构,并且在RegexKeyValue节点下还有子节点<Configs>
,此时不能通过.Net自带的三种数据类型进行装载,只能自定义一种接收RegexKeyValue的数据类,如:
/// <summary>
/// 配置文件类
/// </summary>
public class RegexHelper : ConfigurationSection //必须继承
{
/// <summary>
/// 配置节点
/// </summary>
/// <value>配置集合</value>
[ConfigurationProperty("Configs", IsDefaultCollection = true)]//指定Configs节点
public ConfigNodeCollection Configs
{
get
{
return (ConfigNodeCollection)base["Configs"];
}
}
/// <summary>
/// 获取Config中Key对应的Value
/// </summary>
/// <param name="key">配置Key</param>
/// <param name="defaultValue">默认值</param>
/// <returns> Key对应的Value或者默认值 </returns>
public string GetValueWithKey(string key, string defaultValue = "")
{
return this.Configs.GetValueWithKey(key, defaultValue);//自定义方法
}
}
/// <summary>
/// 所有Key-Value的集合
/// </summary>
public class ConfigNodeCollection : ConfigurationElementCollection //必须继承
{
/// <summary>
/// 构造函数
/// </summary>
public ConfigNodeCollection()
{
ConfigNode element = this.CreateNewElement() as ConfigNode;
}
/// <summary>
/// 根据索引获取配置节点
/// </summary>
/// <param name="index">索引值</param>
/// <returns>配置节点</returns>
public ConfigNode this[int index]//有的文章是直接通过Name进行取值的;
{
get
{
return this.BaseGet(index) as ConfigNode;
}
set
{
if (this.BaseGet(index) != null)
{
this.BaseRemoveAt(index);
}
this.BaseAdd(index, value);
}
}
/// <summary>
/// 获取配置字段值方法
/// </summary>
/// <param name="key">配置Key</param>
/// <param name="defaultValue">默认值</param>
/// <returns>配置值</returns>
public string GetValueWithKey(string key, string defaultValue = "")
{
// 如果Key不存在则抛出异常
if (string.IsNullOrWhiteSpace(key))
{
throw new Exception("get Config Key is null");
}
// 查找Key的值 // Key值区分大小写
foreach (ConfigNode item in this)
{
if (item.Key.Equals(key))
{
return item.Value;
}
}
// 如果默认值不为空,返回默认值
if (!string.IsNullOrWhiteSpace(defaultValue))
{
return defaultValue;
}
// 抛出未找到Key的异常
throw new Exception(string.Format("Key:{0} Is not find!", key));
}
/// <summary>
/// 创建节点函数
/// </summary>
/// <returns>节点对象</returns>
protected override ConfigurationElement CreateNewElement() //必须重写基类方法
{
return new ConfigNode();
}
/// <summary>
/// 获取节点Key
/// </summary>
/// <param name="element">节点对象</param>
/// <returns>节点Key值</returns>
protected override object GetElementKey(ConfigurationElement element) //必须重写基类方法
{
ConfigNode serverElement = element as ConfigNode;
return serverElement.Key;
}
}
/// <summary>
/// 配置节点
/// </summary>
public class ConfigNode : ConfigurationElement
{
[ConfigurationProperty("key", IsRequired = true)]
public string Key
{
get
{
return base["key"].ToString();
}
set
{
base["key"] = value;
}
}
[ConfigurationProperty("value", IsRequired = true)]
public string Value
{
get
{
return base["value"].ToString();
}
set
{
base["value"] = value;
}
}
}
调用如下:
/// <summary>
/// 通过形参Key获取Config中对应的Value值
/// <returns> Key在Config中对应的Value值 </returns>
/// </summary>
private static string GetConfigs(string regexKey) //定义了的一个获取RegexSetting.config的方法
{
RegexHelper config = ConfigurationManager.GetSection("RegexKeyValue") as RegexHelper;//RegexKeyValue是Web.Config中配置的name参数
if (config == null)
{
throw new Exception("未找到对应节点");//或者做其他处理;也可不做处理,直接return;注意try catch
}
return config.GetValueWithKey("regexKey");
}