Пользовательские свойства конфигурации - запись уже добавлена

Я разрабатываю службу Windows, которая при запуске считывает информацию из app.config, что должно позволить нам изменять конфигурацию внутреннего потока без повторного развертывания службы.

Я создал несколько пользовательских разделов и элементов конфигурации следующим образом (реализация опущена):

public class MyConfigurationSection
{
    [ConfigurationProperty("threads")]
    [ConfigurationCollection(typeof(MyThreadCollection), AddItemName="addThread")>
    public MyThreadCollection threads { get; }
}

public class MyThreadCollection
{
    protected override void CreateNewElement();
    protected override object GetElementKey(ConfigurationElement element);
}

public class MyThreadElement
{
    [ConfigurationProperty("active", DefaultValue=true, IsRequired=false)>
    public bool active { get; set; }

    [ConfigurationProperty("batchSize", DefaultValue=10, IsRequired=false)>
    public int batchSize { get; set; }

    [ConfigurationProperty("system", IsRequired=true)>
    public string system { get; set; }

    [ConfigurationProperty("department", IsRequired=true)>
    public string department { get; set; }

    [ConfigurationProperty("connection", IsRequired=true)>
    public MyThreadConnectionElement connection { get; set; }
}

public class MyThreadConnectionElement
{
    [ConfigurationProperty("server", IsRequired=true)>
    public string server { get; set; }

    [ConfigurationProperty("database", IsRequired=true)>
    public string database { get; set; }

    [ConfigurationProperty("timeout", DefaultValue=15, IsRequired=false)>
    public int timeout { get; set; }
}

Затем я добавляю некоторые элементы в app.config следующим образом:

<configurationSection>
    <threads>
        <addThread
            active="True"
            batchSize="50"
            system="MySystem1"
            department="Department1">
            <connectionString
                server="MyServer"
                database="Database1" />
        </addThread>
        <addThread
            active="True"
            batchSize="30"
            system="MySystem2"
            department="Department2">
            <connectionString
                server="MyServer"
                database="Database2" />
        </addThread>
    </threads>
</configurationSection>

Все работает - конфигурация прочитана, потоки созданы, и процессы запущены.

Проблема в том, что я хотел бы, чтобы обе эти темы имели одинаковые system имя / значение - оба должны быть MySystem - но когда я делаю это и запускаю программу, я получаю The entry 'MySystem' has already been added. исключение.

Я подумал, что это может быть потому, что свойство должно быть явно настроено, чтобы разрешить дубликаты, но я не знаю, как, и я не мог найти свойство из ConfigurationProperty класс, который может позволить это, кроме IsKey, но из его описания это не выглядело как ответ, и попытка его не решила проблему. Я на правильном пути здесь?

Первоначально system собственность была названа name и я думаю, что просто может быть любое свойство с именем name рассматривается как уникальный идентификатор, поэтому я изменил его на system но это ничего не изменило.

Я попробовал <clear /> пометить, как некоторые другие, похожие посты, предложенные, без успеха.

Нужно ли добавить другую иерархию в раздел конфигурации - Config -> Department -> Thread вместо Config -> Thread? Я бы предпочел не использовать этот подход.

Спасибо за любой вклад.

1 ответ

Решение

Я на самом деле нашел проблему и решение довольно давно, но забыл опубликовать ответ; спасибо @tote за напоминание.

При реализации ConfigurationElementCollection класс, GetElementKey(ConfigurationElement) метод может быть переопределен. Не понимая, что это за метод, я переопределил его и просто возвратил system значение свойства и, поскольку более одного элемента конфигурации имеют одно и то же системное имя, технически они имеют один и тот же ключ, поэтому возникла ошибка.

Решением для меня было вернуть system и department значения как system.department что привело к уникальным ключам.

Другие вопросы по тегам