ConfigurationManager.GetSection пропускает дубликаты

Короче говоря, метод .Net ConfigurationManager.GetSection пропускает дубликаты, и я ищу лучший способ справиться с этим. У меня есть файл конфигурации, который включает в себя что-то вроде этого:

   <views>
     <view name="BusinessUnitsView" Desc="desc1"/>
     <view name="BusinessUnitsView" Desc="desc2"/>
   </views>

У меня есть граф объектов, на которые загружается конфигурация, где коллекции происходят от нашей производной версии ConfigurationElementCollection. Коллекция представлений на графике имеет только один элемент после загрузки вышеуказанного - я понимаю, что это просто способ, которым ConfigurationManager обрабатывает дубликаты. Последний элемент с таким же ключом выигрывает.

Я мог бы создать исключение при обнаружении дубликата с помощью BaseAdd(element, true). Однако, если возможно, я хотел бы, чтобы объект был полностью загружен с дубликатами, поскольку конфигурация считывается на уровне службы, и я хотел бы обнаружить и решить проблему на стороне потребления службы.

Есть ли у меня какие-либо варианты изменения способа добавления в коллекцию работы?


person Phil Sandler    schedule 26.04.2011    source источник


Ответы (2)


Вам нужно будет создать свой собственный файл ConfigurationSection. См. здесь или здесь (метод второй ссылки устарел, но может пролить свет)

Это позволяет вам представлять внутренние переменные конфигурации в виде коллекций и устанавливать такие свойства, как DefaultValue и IsRequired.

person James King    schedule 26.04.2011
comment
Кроме того, это ошибка, заключающаяся в том, что он не поддерживает дубликаты... Я понимаю, что внутренние переменные для обработчиков раздела конфигурации по умолчанию используют NameValueCollections и должны объединять несколько значений в строку, разделенную запятыми. Я не знаю, почему они этого не делают, но у меня была такая же проблема. - person James King; 27.04.2011
comment
Я думаю, что это специально, последнее имеет значение. Подумайте о Machine.config - person Henk Holterman; 27.04.2011
comment
Имеет смысл заставить его действовать таким образом намеренно... просто странно, что в документации всегда говорится, что когда вы добавляете несколько значений для ключей, вы получаете список значений, разделенных запятыми. Может, от этой идеи отказались, а документацию так и не обновили? - person James King; 27.04.2011
comment
Джеймс, я не слишком знаком с документами. Но когда я смотрю на образец XML, я могу только подумать: вы этого не хотите. Здесь имя примерно такое же, как ID. - person Henk Holterman; 27.04.2011
comment
Я согласен, как написано, несколько значений не имеют смысла... Однако я вижу ситуации, когда вам нужно несколько значений. В любом случае OP хочет прочитать несколько значений... и клиент всегда прав; ) - person James King; 27.04.2011

Может быть, вы хотите только перебрать список, но основная идея конфигурации заключается в том, что вы можете сделать

var view = SomeConfigClass["BusinessUnitsView"];

Это позволяет только один ответ.

person Henk Holterman    schedule 26.04.2011
comment
В документации не говорится, что для настройки будет более одного значения... будет только одно значение, строка. В нем говорится, что эта строка будет списком всех значений, разделенных запятыми, которые вы установили. Я вижу всевозможные проблемы с этим; может поэтому и не сделали? - person James King; 27.04.2011