通过继承ConfigurationValidatorBase类,用户可以自定义一个配置系统的验证器,可是今天使用这种方法发现了一个问题:每个ConfigurationProperty在验证其实际值前,都要对其默认值先进行一次验证,注意这里只是验证一次,发生在验证第一个ConfigurationProperty的值之前。表现形式就好像静态构造函数似的。
比如下面的ConfigurationSection和ConfigurationValidatorBase代码:(代码模拟验证年龄必须大于等于15岁,否则抛出异常)
接着app.config定义一个合法的和一个非法的(Age小于15的AgeSection)ConfigurationSection
测试逻辑代码:这段代码,最初想当然是先输出29,因为mysec1会通过验证,接着接到ConfigurationErrorsException,因为mysec2不会通过验证的。可结果却是连29都没有输出,直接显示没有通过验证的错误信息,检查ConfigurationErrorsException的Line属性竟然是0。
经过调试发现执行验证器(本例中的Age15Validator类)的Validate函数次数是3,而不是最初所期望的2。这三次传入的参数值分别是0,29,4。而这个0就是文章开头提到的一类ConfigurationProperty的默认值,再次强调一下这个默认参数的验证只调用一次,并且是限于任何实际ConfigurationProperty的真实值。
那么,针对上述问题,解决方案是设置ConfigurationProperty的默认值并确保这个默认值能够顺利通过验证器的验证,比如上述程序我们就可以把AgeSection的Age属性的默认值改成15.
这样的话,程序就可以按要求运行了。第一行输出29(mysec1属性通过验证)
第二行输出错误信息并指出行数。(mysec2没有通过验证)
分享到:
相关推荐
Invalid Configuration Property(处理方案).md
Configuration Property Missing(处理方案).md
这些模块通过Maven的依赖、聚合和继承关系组织在一起,形成一个完整的项目结构。每个模块都有自己的POM.xml文件,定义了其依赖、构建配置和可能的子模块。 总结起来,Maven的依赖管理、聚合、继承和插件运行机制是...
[ConfigurationProperty("property1", IsRequired = true)] public string Property1 { get { return (string)this["property1"]; } set { this["property1"] = value; } } [ConfigurationProperty(...
此外,还可以使用第三方库如Apache Commons Configuration或Java 8引入的`java.util.prefs.Preferences` API来提供更高级的配置管理功能,如支持XML配置、默认值、监听属性变化等。 总结,Java中的`java.util....
超高频开发包xy-new.part06.rar
在使用MyBatis框架时,可能会遇到一个特定的异常:“Property 'configLocation' not specified, using default MyBatis Configuration”。这个异常通常表明MyBatis在启动时无法找到配置文件的位置,因此它会使用默认...
在这个例子中,`ConfigSectionData` 类有两个属性:`Id` 和 `Time`,它们都被 `ConfigurationProperty` 特性标记,这意味着它们会被序列化到配置文件中。 在实际操作配置文件时,我们可以使用 `Configuration...
在.NET中,配置节是通过继承`System.Configuration.ConfigurationSection`类来实现的。创建一个新的DLL类库项目,例如命名为`CustomConfigSectionLibrary`,然后在该库中定义一个自定义配置节类。例如: ```csharp ...
这可以通过继承`System.Configuration.ConfigurationSection`类来实现。例如,我们可以创建一个名为`CustomSettingsSection`的类: ```csharp public class CustomSettingsSection : ConfigurationSection { ...
[ConfigurationProperty("name", IsRequired = true)] public string Name => (string)this["name"]; [ConfigurationProperty("value", IsRequired = true)] public string Value => (string)this["value"]; } ...
[ConfigurationProperty("sqlConnectionString", IsRequired = true)] public string SqlConnectionString { get { return (string)this["sqlConnectionString"]; } set { this["sqlConnectionString"] = value...
这个类需要继承`ConfigurationSection`类,并使用`ConfigurationProperty`属性定义属性。例如: ```csharp public class CustomConfigSection : ConfigurationSection { [ConfigurationProperty(...
然后,通过定义公共属性来映射配置文件中的配置项,并使用ConfigurationProperty特性来关联配置项和公共属性。 创建配置类通常需要完成三步工作: - 继承System.Configuration.ConfigurationSection类。 - 使用...
7. **默认值和合并策略**:Library 允许定义默认值,并提供了策略来处理不同配置源之间的冲突。这有助于确保即使在某些配置缺失的情况下,程序也能正常运行。 8. **XML配置的解析**:对于XML配置文件,Commons ...
1. **Configuration类的结构**:查看Configuration类的继承层次,了解其接口和实现,以及其中的成员变量和它们的用途。 2. **构造函数**:分析不同构造函数如何初始化Configuration对象,了解它们如何根据设备当前...
Apache Commons Configuration 是一个Java库,专门用于处理配置文件和提供灵活的访问配置数据的API。这个库被设计成模块化和可扩展的,允许开发者在各种各样的应用场景中轻松地处理配置参数。"commons-configuration...
通过在自定义配置类中使用`ConfigurationProperty`特性,可以指定配置属性,如`MySection333`所示: ```xml <Command1>... <Command2>... ``` 在对应的配置类中,可以定义属性并用`ConfigurationProperty`...
通过使用`ConfigurationProperty`属性,我们可以指定哪些属性可以从配置文件中读取。例如,`id`和`time`两个属性分别映射到配置文件中的`id`和`time`元素。 #### 二、操作配置文件 接下来,我们将展示如何使用`...
Configuration。dll 文件,Manage.dll文件