ASP.NET MVC如何自定义Config及如何使用,亲测易懂

需求:最近老板要求将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");
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值