Пользовательские свойства конфигурации - запись уже добавлена
Я разрабатываю службу 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
что привело к уникальным ключам.