专栏首页大内老A一个关于ConfigurationManager.GetSecion方法的小问题

一个关于ConfigurationManager.GetSecion方法的小问题

昨天在进行Code Review的时候,发现一个关于配置节读取的问题。虽然这是一个很小的问题,还是它已经存在在项目里面很久了,直到今天才被发现,所以觉得具有一定分享的价值。

闲话少说,我们直接通过一个小例子来模拟发现的这个Bug。项目中自定义了一个配置节(ConfigurationSection),作为模拟,我们定义了如下一个简单TestConfigurationSection类。TestConfigurationSection继承自ConfigurationSection,具有唯一的一个必需(IsRequired=true)配置属性Type,我们在这里设置一个类型的有效名称。

   1: public class TestConfigurationSection : ConfigurationSection
   2: {
   3:     [ConfigurationProperty("type", IsRequired = true)]
   4:     public string Type
   5:     {
   6:         get { return (string)this["type"]; }
   7:     }
   8: }

在程序中,需要读取配置,根据type配置项动态创建对应的实例。为了确保配置节的存在,我们对通过ConfigurationManager.GetSection方法获取出来的对象进行了空值校验。程序很简单,貌似没有什么问题。

   1: static void Main(string[] args)
   2: {
   3:     var config = ConfigurationManager.GetSection("artech.testSettings") as TestConfigurationSection;
   4:     if(null == config)
   5:     {
   6:         throw new ConfigurationErrorsException("Miss configuration...");
   7:     }
   8:     var instance = Activator.CreateInstance(Type.GetType(config.Type));
   9: }

下面是我们的配置:我们仅仅在<configSections/>节点添加了我们自定义的TestConfigurationSection配置节类型,并没有进行真正的配置(被注释掉的那部分)。

   1: <?xml version="1.0"?>
   2: <configuration>
   3:   <configSections>
   4:     <section name="artech.testSettings" type="Artech.CustomConfig.TestConfigurationSection, Artech.CustomConfig"/>
   5:   </configSections>
   6:   <!--<artech.testSettings type="System.Int32"/>-->
   7: </configuration>

现在运行上面的程序,抛出如下一个ArgumentNullExcption异常,从异常消息我们不难看出,是由于config的Type属性为Null导致的(因为没有配置)。

也就是说,只要<configSections/>存在具有指定名称的配置节配置,它就认为是配置节存在。ConfigurationManager.GetSection方法也会真正返回一个对应的类型的ConfigurationSection对象。在这种情况下,配置元素的默认值(通过ConfigurationPropertyAttribute的DefaultValue属性定义)会反映在该ConfigurationSection对象上,所以不会有什么问题。比较麻烦就是例子中的那些必需(通过ConfigurationPropertyAttribute的IsRequired属性定义)配置属性,你认为一定有个确定的值,那么的程序可能就因为这个而不能运行。

各位可以发表各自的看法,ConfigurationManager的GetSection方法是否应该在真正的配置元素不存在的时候返回Null呢?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • .NET Core采用的全新配置系统[1]: 读取配置数据

    提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我...

    蒋金楠
  • 如何解决HP QC(Quality Center)在Windows 7下不能工作的问题

    HP QC(Quantity Center)是一款不错的测试管理工具,最近把公司的操作系统从Windows XP升级到Windows 7之后,发现登录到QC S...

    蒋金楠
  • ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数...

    蒋金楠
  • 微服务架构之「 配置中心 」

    在微服务架构的系列文章中,前面已经通过文章《微服务架构之「服务网关 」》介绍过了在微服务中服务网关的原理和应用,今天这篇文章我们继续来聊一聊微服务中另外一个重要...

    奎哥
  • 后起之秀go语言你了解吗?助你年薪30W+

    随着云计算越来越普及,企业原来以内部IDC机房为载体的IT基础架构也逐渐发生了很大的变化,企业的业务系统除了部署在原来物理架构外,可能部署在yMware私有云、...

    小小科
  • 《黑客帝国》将重现!人脑植入纳米机器人,秒速获取所有知识

    在这部明见万里“预言书”般的电影中,主角托马斯.安德森(化名“尼奥”的黑客),为了搞清楚Matrix到底是什么,义无反顾吞下红色药丸,踏上探寻真相之路。

    新智元
  • vue 工作中用到一些小技巧

    vm.$watch( expOrFn, callback, [options] )

    冯杰宁
  • 使用sql语句分析双色球(85天)

    这个题目看似有点无厘头,老写技术博客,也来干点“正事",用sql语句分析一下近十年来的双色球情况,不过我肯定算不出来开奖结果,纯属个人娱乐, 个人觉得概率让一切...

    jeanron100
  • 聊聊Git原理

    说起Git,相信大家都很熟悉了,毕竟作为程序猿,每天的业余时间除了吃饭睡觉就是逛一下全世界最大的开(tong)源(xing)代(jiao)码(you)网站Git...

    Jackeyzhe
  • H3C AP胖转瘦方法大全

    py3study

扫码关注云+社区

领取腾讯云代金券