Как создать в моем App.config переменное количество настроек?

Итак, у меня есть служба Windows, которая отключается и выполняет некоторую работу на сервере каждые несколько минут. Служба считывает много информации (хост, имя пользователя, порт и т. Д.) О сервере, к которому он подключается, из App.config, и он отлично работает.

Теперь у меня есть требование, чтобы служба обслуживала n разных серверов. Итак, теперь моя служба должна читать из App.config и последовательно делать то, что ей нужно для server1..serverN. Подождите заданное время, а затем снова запустите на server1.

Я не знаю, как и как лучше всего сохранить n наборов настроек сервера в App.config, а затем программно определить, сколько наборов настроек есть, а затем прочитать каждый набор.

Я подумал о настройке, которая говорит мне, что есть 5 серверов, а затем о настройках для server1..server5, но это действительно не элегантно.

Есть лучший способ сделать это?

Мой полный исходный файл находится ниже:

using System;
using System.Collections;
using System.Text;
using System.Configuration;
using System.Xml;

namespace FTPConfig
{
    public class MyAppConfig : ConfigurationSection
    {
        public static MyAppConfig GetConfiguration()
        {
            MyAppConfig configuration = ConfigurationManager.GetSection("MainSettings") as MyAppConfig;

            if (configuration != null) return configuration;

            return new MyAppConfig();
        }
    }

    [ConfigurationProperty("host", IsRequired = true)]
    public String Host 
    { 
        get 
        { 
            return this["host"] as string; 
        } 
    }
}

person Chris A    schedule 21.11.2012    source источник
comment
Я бы сказал, что app.config плохо справляется с этой задачей. Почему бы не сохранить свои настройки в сериализуемом XML-документе или в БД?   -  person Grant H.    schedule 21.11.2012
comment
@GrantH. БД была бы серьезным излишеством для этого крошечного сервисного приложения, и, поскольку у меня нет пользовательского интерфейса, я надеюсь, что технический пользователь может редактировать файл, который они могут редактировать. Хотя, спасибо, тогда у меня может не быть выбора.   -  person Chris A    schedule 21.11.2012


Ответы (2)


Вы можете использовать настраиваемый раздел в файле app.config и использовать там любой XML-файл, который вам нравится.

person wimh    schedule 21.11.2012
comment
Да, я хотел бы понять, почему я получаю Тип или имя пространства имен «ConfigurationSection» не может быть найдено (вам не хватает директивы using или ссылки на сборку?) Все время. Я не знаю почему, но я просто не могу заставить это работать, что бы я ни делал ... - person Chris A; 21.11.2012
comment
@ChrisA вы добавляли ссылку на System.Configuration? - person wimh; 22.11.2012
comment
да. Сейчас я отредактирую исходный вопрос с полным .cs. - person Chris A; 22.11.2012
comment
Вы сэр легенда !! Большое тебе спасибо! Показывает, что происходит, когда вы пытаетесь самостоятельно выучить новый язык и новую среду, я бы никогда об этом не подумал! - person Chris A; 22.11.2012

Я хотел сделать некоторые настройки доступными для модельного класса сборки библиотеки, и при поиске решений я обнаружил класс под названием «XmlConfigurator», описанный здесь. В резюме вы можете создать раздел в своем App.config и сопоставить его с любым типом, который вы хотите. Например. Предположим, у вас есть следующий класс:

public class MySettings
{
    public int Setting1 { get; set; }

    public string Setting2 { get; set; }
}

В вашем app.config вам просто нужно добавить:

<configuration>
<configSections>
    <section name="MySettings" type="MyApp.XmlConfigurator, MyApp" />
</configSections>

<MySettings type="MyApp.MySettings, MyApp">
    <Setting1>10</Setting1>
    <Setting2>MyValue</Setting2>
</MySettings>
</configuration>

Когда вы инициализируете свое приложение, вы можете легко его загрузить:

var settings = (MyApp.MySettings)ConfigurationManager.GetSection("MySettings");

XmlConfigurator:

public sealed class XmlConfigurator : IConfigurationSectionHandler
{
    public XmlConfigurator()
    {
    }

    //<?xml version="1.0" encoding="utf-8" ?>
    //<configuration>
    //    <configSections>
    //        <section name="DispatchSettings" type="MyNamespace.XmlConfigurator, MyNamespace.Core" />
    //    </configSections>

    //    <DispatchSettings type="MyNamespace.DispatchSettings, MyNamespace.Core">
    //        <ServiceIsActive>True</ServiceIsActive>
    //        <DispatchProcessBatchSize>100</DispatchProcessBatchSize>
    //    </DispatchSettings>
    public object Create(object parent, object configContext, XmlNode section)
    {
        XPathNavigator navigator = null;
        String typeName = null;
        Type sectionType = null;
        XmlSerializer xs = null;
        XmlNodeReader reader = null;

        try
        {
            Object settings = null;

            if (section == null)
                return settings;

            navigator = section.CreateNavigator();
            typeName = (string)navigator.Evaluate("string(@type)");
            sectionType = Type.GetType(typeName);

            if (sectionType == null)
                throw new ArgumentException("Could not find the specified type: " + typeName);

            xs = new XmlSerializer(sectionType);
            reader = new XmlNodeReader(section);

            settings = xs.Deserialize(reader);

            return settings;
        }
        finally
        {
            xs = null;
        }
    }
}
person Arthur Nunes    schedule 21.11.2012