首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有递归ConfigurationElement的自定义配置节

带有递归ConfigurationElement的自定义配置节
EN

Stack Overflow用户
提问于 2019-09-17 20:14:03
回答 1查看 100关注 0票数 0

我正在尝试创建一个表示以下xml结构的自定义配置节:

代码语言:javascript
复制
<observerSettings>
   <jobSettings>
      <filter key="location" value="de">
        <filter key="type" value="MyType1">
          <filter key="status" value="failed">
            <actions>
              <notify timespan="12.00:00:00">
                <mailSettings>
                  <mailAddress to="mail1@something.com" />
                  <mailAddress to="mail2@something.com" />
                </mailSettings>
              </notify>
              <remove timespan="14.00:00:00">
                <mailSettings>
                  <mailAddress to="mail1@something.com" />
                  <mailAddress to="mail2@something.com" />
                </mailSettings>
              </remove>
            </actions> 
          </filter>
        </filter>
      </filter>
   </jobSettings>
</observerSettings>

FilterConfigElement的定义如下:

代码语言:javascript
复制
internal class FilterConfigElement : ConfigurationElement, IFilterConfigElement
{
        [ConfigurationProperty("filter", IsRequired = false)]
        public FilterConfigElement ChildFilter => base["filter"] as FilterConfigElement;

        [ConfigurationProperty("actions", IsRequired = false)]
        public ActionsConfigElement Actions => base["actions"] as ActionsConfigElement;

        [ConfigurationProperty("key", IsRequired = true)]
        public string Key => base["key"] as string;

        [ConfigurationProperty("value", IsRequired = false)]
        public string Value => base["value"] as string;
}

当像下面这样访问配置节时,应用程序崩溃,并出现StackOverflow异常:

代码语言:javascript
复制
internal class ObserverSettings : ConfigurationSection, IObserverSettings
{
   public static IObserverSettings Instance { get; private set; } = ConfigurationManager.GetSection("observerSettings") as ObserverSettings;

   [ConfigurationProperty("jobSettings")]
   protected JobSettingsCollection JobSettingsCollection => base["jobSettings"] as JobSettingsCollection;

   public virtual IJobSettingsCollection JobSettings => JobSettingsCollection;
}

因此,我假设ConfigurationManager正在创建具有无限深度的结构,并且在到达最后一个filter元素时不会停止。这能以某种方式受到限制吗?这种结构是否得到了支持?

EN

回答 1

Stack Overflow用户

发布于 2019-09-18 15:54:50

好的,在深入研究了ConfigurationElement的实现之后,似乎根本不可能像我尝试的那样创建递归结构。

问题的原因是PropertiesFromType的实现,其中将属性分配给s_propertyBags是在调用CreatePropertyBagFromType之后完成的,因此在properties始终为null的情况下创建了无休止的递归。

代码语言:javascript
复制
private static bool PropertiesFromType(Type type, out ConfigurationPropertyCollection result)
{
   ConfigurationPropertyCollection properties = (ConfigurationPropertyCollection)s_propertyBags[type];
   result = null;
   bool firstTimeInit = false;
   if (properties == null) /*code omitted*/
   {
      properties = CreatePropertyBagFromType(type);
      s_propertyBags[type] = properties;
      firstTimeInit = true;
   }
   result = properties;
   return firstTimeInit;
}

来源:https://referencesource.microsoft.com/#System.Configuration/System/Configuration/ConfigurationElement.cs

编辑:

保持某种“递归”结构的唯一解决办法是将所有子FilterConfigElement包装到一个元素名为childFilterConfigurationElementCollection中。这导致下面的配置结构不是很好,但可以接受:

代码语言:javascript
复制
<jobSettings>
  <filter key="location" value="de">
    <childFilter>
      <filter key="type" value="MyType1">
        <childFilter>
          <filter key="status" value="failed">
            <actions>
              <!-- ... -->
            </actions>
          </filter>
        </childFilter>
      </filter>
    </childFilter>
  </filter>
</jobSettings>

来源:Recursive Custom Configuration in c#

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57973983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档