0

假设以下 XML,正确的自定义配置代码是什么?:

<ServicesMonitor>
  <serviceTestGroups>
    <serviceTestGroup name="foo">
      <serviceTest uri="http://server1/GIS/rest/services/geocode/FindAddress/GeocodeServer?f=json" expectedResponseTime="1000" />
      <serviceTest uri="http://server2/GIS/rest/services/geocode/FindAddress/GeocodeServer?f=json" expectedResponseTime="1000" />
      <serviceTest uri="http://server3/GIS/rest/services/geocode/FindAddress/GeocodeServer?f=json" expectedResponseTime="1000" />
    </serviceTestGroup>
  </serviceTestGroups>
</ServicesMonitor>

我知道我需要:

  • 服务测试元素:配置元素

我想我需要:

  • 服务测试元素集合:配置元素集合
  • ServiceTestGroupsElement : 配置部分
4

2 回答 2

1

这不是您上面的确切 XML,但它非常接近:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="servicesMonitor" type="TestConfigurationElement.ServicesMonitorSection, TestConfigurationElement"/>
  </configSections>
  <servicesMonitor>
    <serviceTestGroups>
      <add name="foo">
        <serviceTests>
          <add uri="http://server1/GIS/rest/services/geocode/FindAddress/GeocodeServer?f=json" expectedResponseTime="1000" />
          <add uri="http://server2/GIS/rest/services/geocode/FindAddress/GeocodeServer?f=json" expectedResponseTime="1000" />
          <add uri="http://server3/GIS/rest/services/geocode/FindAddress/GeocodeServer?f=json" expectedResponseTime="1000" />
        </serviceTests>
      </add>
    </serviceTestGroups>
  </servicesMonitor>
</configuration>

这是代码:

using System;
using System.Configuration;

namespace TestConfigurationElement
{
    public class ServicesMonitorSection : ConfigurationSection
    {
        [ConfigurationProperty("serviceTestGroups", IsRequired = true)]
        public ServiceTestGroupElementCollection ServiceTestGroups
        {
            get { return (ServiceTestGroupElementCollection)this["serviceTestGroups"]; }
            set { this["serviceTestGroups"] = value; }
        }
    }

    public class ServiceTestGroupElement : ConfigurationElement
    {
        [ConfigurationProperty("name", IsRequired = true)]
        public string Name
        {
            get { return (string)this["name"]; }
            set { this["name"] = value; }
        }

        [ConfigurationProperty("serviceTests", IsRequired = true)]
        public ServiceTestElementCollection ServiceTests
        {
            get { return (ServiceTestElementCollection)this["serviceTests"]; }
            set { this["serviceTests"] = value; }
        }
    }

    public class ServiceTestGroupElementCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ServiceTestGroupElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ServiceTestGroupElement)element).Name;
        }
    }

    public class ServiceTestElement : ConfigurationElement
    {
        [ConfigurationProperty("uri", IsRequired = true)]
        public Uri Uri
        {
            get { return (Uri)this["uri"]; }
            set { this["uri"] = value; }
        }

        [ConfigurationProperty("expectedResponseTime", IsRequired = true)]
        public int ExpectedResponseTime
        {
            get { return (int)this["expectedResponseTime"]; }
            set { this["expectedResponseTime"] = value; }
        }
    }

    public class ServiceTestElementCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ServiceTestElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ServiceTestElement)element).Uri;
        }
    }

    public static class Program
    {
        public static void Main(string[] args)
        {
            ServicesMonitorSection section = (ServicesMonitorSection)ConfigurationManager.GetSection("servicesMonitor");
        }
    }
}
于 2012-11-27T03:22:40.437 回答
0

这是我想出的最终解决方案。我只需要稍微修改 taylorjonl 的代码。

namespace Demo.ServiceMonitor
{
    using System;
    using System.Configuration;

    public class ServiceMonitorSection : ConfigurationSection
    {
        [ConfigurationCollection(typeof(ServiceTestGroupElementCollection), AddItemName = "serviceTestGroup")]
        [ConfigurationProperty("serviceTestGroups", IsRequired = true)]
        public ServiceTestGroupElementCollection ServiceTestGroups
        {
            get { return this["serviceTestGroups"] as ServiceTestGroupElementCollection; }
            set { this["serviceTestGroups"] = value; }
        }
    }

    public class ServiceTestGroupElementCollection : ConfigurationElementCollection
    {
        public ServiceTestGroupElement this[int index]
        {
            get { return (ServiceTestGroupElement)this.BaseGet(index); }
            set
            {
                if (this.BaseGet(index) != null)
                {
                    this.BaseRemoveAt(index);
                    this.BaseAdd(index, value);
                }
            }
        }

        public ServiceTestGroupElement this[string Name]
        {
            get { return (ServiceTestGroupElement)this.BaseGet(Name); }
        }

        protected override ConfigurationElement CreateNewElement()
        {
            return new ServiceTestGroupElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ServiceTestGroupElement)element).Name;
        }
    }

    public class ServiceTestGroupElement : ConfigurationElement
    {
        [ConfigurationProperty("name", IsKey = true, IsRequired = true)]
        public string Name
        {
            get { return this["name"] as string; }
            set { this["name"] = value; }
        }

        [ConfigurationCollection(typeof(ServiceTestElementCollection), AddItemName = "serviceTest")]
        [ConfigurationProperty("serviceTests", IsKey = false, IsRequired = true)]
        public ServiceTestElementCollection ServiceTests
        {
            get { return this["serviceTests"] as ServiceTestElementCollection; }
            set { this["serviceTests"] = value; }
        }
    }

    public class ServiceTestElementCollection : ConfigurationElementCollection
    {
        public ServiceTestElement this[int index]
        {
            get { return (ServiceTestElement)this.BaseGet(index); }
            set
            {
                if (this.BaseGet(index) != null)
                {
                    this.BaseRemoveAt(index);
                    this.BaseAdd(index, value);
                }
            }
        }

        public ServiceTestElement this[string Name]
        {
            get { return (ServiceTestElement)this.BaseGet(Name); }
        }

        protected override ConfigurationElement CreateNewElement()
        {
            return new ServiceTestElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ServiceTestElement)element).Uri;
        }
    }

    public class ServiceTestElement : ConfigurationElement
    {
        [ConfigurationProperty("uri", IsKey = true, IsRequired = true)]
        public Uri Uri
        {
            get { return this["uri"] as Uri; }
            set { this["uri"] = value; }
        }

        [ConfigurationProperty("expectedResponseTime", IsKey = false, IsRequired = true)]
        public int ExpectedResponseTime
        {
            get { return (int)this["expectedResponseTime"]; }
            set { this["expectedResponseTime"] = value; }
        }
    }
}

XML 看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="servicesMonitor"
             type="Demo.ServiceMonitor.ServiceMonitorSection, Demo.ServiceMonitor"/>
  </configSections>
  <servicesMonitor>
    <serviceTestGroups>
      <serviceTestGroup name="Geocoding Service Tests">
        <serviceTests>
          <serviceTest uri="http://server1/GIS/rest/services/geocode/FindAddress/GeocodeServer?f=json" expectedResponseTime="1000" />
          <serviceTest uri="http://server2/GIS/rest/services/geocode/FindAddress/GeocodeServer?f=json" expectedResponseTime="1000" />
          <serviceTest uri="http://server3/GIS/rest/services/geocode/FindAddress/GeocodeServer?f=json" expectedResponseTime="1000" />
        </serviceTests>
      </serviceTestGroup>
    </serviceTestGroups>
  </servicesMonitor>
</configuration>

谢谢,

汤姆

于 2012-11-27T17:43:27.050 回答