一个关于ConfigurationManager.GetSecion方法的小问题
2011-01-15 15:27
471 查看
昨天在进行Code Review的时候,发现一个关于配置节读取的问题。虽然这是一个很小的问题,还是它已经存在在项目里面很久了,直到今天才被发现,所以觉得具有一定分享的价值。
闲话少说,我们直接通过一个小例子来模拟发现的这个Bug。项目中自定义了一个配置节(ConfigurationSection),作为模拟,我们定义了如下一个简单TestConfigurationSection类。TestConfigurationSection继承自ConfigurationSection,具有唯一的一个必需(IsRequired=true)配置属性Type,我们在这里设置一个类型的有效名称。
[/code]
在程序中,需要读取配置,根据type配置项动态创建对应的实例。为了确保配置节的存在,我们对通过ConfigurationManager.GetSection方法获取出来的对象进行了空值校验。程序很简单,貌似没有什么问题。
[/code]
下面是我们的配置:我们仅仅在<configSections/>节点添加了我们自定义的TestConfigurationSection配置节类型,并没有进行真正的配置(被注释掉的那部分)。
[/code]
现在运行上面的程序,抛出如下一个ArgumentNullExcption异常,从异常消息我们不难看出,是由于config的Type属性为Null导致的(因为没有配置)。
也就是说,只要<configSections/>存在具有指定名称的配置节配置,它就认为是配置节存在。ConfigurationManager.GetSection方法也会真正返回一个对应的类型的ConfigurationSection对象。在这种情况下,配置元素的默认值(通过ConfigurationPropertyAttribute的DefaultValue属性定义)会反映在该ConfigurationSection对象上,所以不会有什么问题。比较麻烦就是例子中的那些必需(通过ConfigurationPropertyAttribute的IsRequired属性定义)配置属性,你认为一定有个确定的值,那么的程序可能就因为这个而不能运行。
各位可以发表各自的看法,ConfigurationManager的GetSection方法是否应该在真正的配置元素不存在的时候返回Null呢?
闲话少说,我们直接通过一个小例子来模拟发现的这个Bug。项目中自定义了一个配置节(ConfigurationSection),作为模拟,我们定义了如下一个简单TestConfigurationSection类。TestConfigurationSection继承自ConfigurationSection,具有唯一的一个必需(IsRequired=true)配置属性Type,我们在这里设置一个类型的有效名称。
[code] public class TestConfigurationSection : ConfigurationSection { [ConfigurationProperty("type", IsRequired = true)] public string Type { get { return (string)this["type"]; } } }
[/code]
在程序中,需要读取配置,根据type配置项动态创建对应的实例。为了确保配置节的存在,我们对通过ConfigurationManager.GetSection方法获取出来的对象进行了空值校验。程序很简单,貌似没有什么问题。
[code] static void Main(string[] args) { var config = ConfigurationManager.GetSection("artech.testSettings") as TestConfigurationSection; if(null == config) { throw new ConfigurationErrorsException("Miss configuration..."); } var instance = Activator.CreateInstance(Type.GetType(config.Type)); }
[/code]
下面是我们的配置:我们仅仅在<configSections/>节点添加了我们自定义的TestConfigurationSection配置节类型,并没有进行真正的配置(被注释掉的那部分)。
[code] <?xml version="1.0"?> <configuration> <configSections> <section name="artech.testSettings" type="Artech.CustomConfig.TestConfigurationSection, Artech.CustomConfig"/> </configSections> <!--<artech.testSettings type="System.Int32"/>--> </configuration>
[/code]
现在运行上面的程序,抛出如下一个ArgumentNullExcption异常,从异常消息我们不难看出,是由于config的Type属性为Null导致的(因为没有配置)。
也就是说,只要<configSections/>存在具有指定名称的配置节配置,它就认为是配置节存在。ConfigurationManager.GetSection方法也会真正返回一个对应的类型的ConfigurationSection对象。在这种情况下,配置元素的默认值(通过ConfigurationPropertyAttribute的DefaultValue属性定义)会反映在该ConfigurationSection对象上,所以不会有什么问题。比较麻烦就是例子中的那些必需(通过ConfigurationPropertyAttribute的IsRequired属性定义)配置属性,你认为一定有个确定的值,那么的程序可能就因为这个而不能运行。
各位可以发表各自的看法,ConfigurationManager的GetSection方法是否应该在真正的配置元素不存在的时候返回Null呢?
相关文章推荐
- 关于类继承中子类方法比父类方法丰富,一个引用值传递的小问题
- DataGuard - 一个关于Physical Standby中recover问题的解决方法
- 关于Fragment调用生命周期方法的一个问题
- Cocoapods 关于Updating local specs repositories的问题和单独更新/加载某一个库的方法
- CSDN上的一个问题贴(关于内部类在外部类静态方法中使用问题)
- 关于Android DES加密算法在不同平台加密结果不同的问题的一个解决方法
- C#中一个关于format函数问题的解决方法
- 碰上一个关于用户验证的问题,不知道您有没有解决方法
- 关于jQuery EasyUI 中刷新Tab选项卡 后一个页面变形的问题的解决方法
- 关于FreeMarker获取一个对象中另一个对象出现的问题以及解决方法
- 关于一个字符出现1次或者n次输出问题的解决方法
- C# 关于out关键字的用法(一个方法返回多个值的问题)
- 关于C++中子类调用父类方法的一个问题
- 关于form使用form.submit()提交的一个问题,提示form.submit不是对象的方法属性
- 关于C++中子类调用父类方法的一个问题
- JS中关于call()方法的一个问题(转自百度知道,解答非常详细清楚)
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- 关于java多线程中同步的问题(两个线程访问同一个实例类的两个同步方法,会不会互相影响)
- 关于BufferedInputStream类的mark与reset方法的一个bug的问题
- 关于ubuntu无法开机问题,显示安装错误 ubuntu install problem the configuration defaults for gnome power manager have