Domanda

Assuming the following XML, what is the correct Custom Configuration code?:

<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>

I know I need:

  • ServiceTestElement : ConfigurationElement

And I think I need:

  • ServiceTestElementCollection : ConfigurationElementCollection
  • ServiceTestGroupsElement : ConfigurationSection
È stato utile?

Soluzione

This isn't the exact XML you have above but it is very close:

<?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>

Here is the code:

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");
        }
    }
}

Altri suggerimenti

Here's the final solution I came up with. I only needed to modify taylorjonl's code very slightly.

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; }
        }
    }
}

And the XML looks like this:

<?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>

thanks,

Tom

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top