Не удалось сохранить изменения в конфигурационном файле - PullRequest
1 голос
/ 22 января 2012

Я следил за этой темой Stackoverflow . Все работает на стороне чтения. Я получаю коллекцию, которую я превращаю в словарь содержания раздела. Я публикую это в других проектах. Проблемы возникают, когда я пытаюсь сохранить измененную запись раздела. Один из внешних проектов отправляет пару ключ / значение, и мне нужно сохранить ее в моем разделе. Вот мой App.Config

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
        <configSections>
           <section name="fileEnvironmentSection" type="MyApp.Infrastructure.Configuration.FileEnvironmentSection, MyApp.Infrastructure"/>
        </configSections>

        <fileEnvironmentSection>
           <fileEnvironment>
             <add key="TestEntry1" value="A nice value"/> 
             <add key="TestEntry2" value="Another value"/> 
            </fileEnvironment>
        </fileEnvironmentSection>
     </configuration>

Вот три уровня типов, необходимые для взаимодействия с разделом конфигурации.

     using System.Configuration;

     namespace SlamDunk.Infrastructure.Configuration {
        public class FileEnvironmentSection : ConfigurationSection {

           [ConfigurationProperty("fileEnvironment", IsDefaultCollection = false)]
           [ConfigurationCollection(typeof(FileEnvironmentCollection), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")]
           public FileEnvironmentCollection FileEnvironmentList {
              get { return (FileEnvironmentCollection)base["fileEnvironment"]; }
           }
        }
     }


     using System.Configuration;

     namespace SlamDunk.Infrastructure.Configuration {
        public class FileEnvironmentCollection : ConfigurationElementCollection {

           public FileEnvironmentElement this[int index] {
              get { return (FileEnvironmentElement)BaseGet(index); }
              set {
                 if(BaseGet(index) != null) BaseRemoveAt(index);
                 BaseAdd(index, value);
              }
           }

           public void Add(FileEnvironmentElement fileEnvironmentElement) { BaseAdd(fileEnvironmentElement); }

           public void Clear() { BaseClear(); }

           protected override ConfigurationElement CreateNewElement() { return new FileEnvironmentElement(); }

           protected override object GetElementKey(ConfigurationElement element) { return ((FileEnvironmentElement)element).Key; }

           public void Remove(FileEnvironmentElement fileEnvironmentElement) { BaseRemove(fileEnvironmentElement.Key); }

           public void Remove(string key) { BaseRemove(key); }

           public void RemoveAt(int index) { BaseRemoveAt(index); }
        }
     }


     using System.Configuration;

     namespace SlamDunk.Infrastructure.Configuration {
        public class FileEnvironmentElement : ConfigurationElement {

           private const string appConfigDefaultString = "missing";
           private const string _appConfigNameKey = "key";
           private const string _appConfigNameValue = "value";

           public FileEnvironmentElement() { }

           public FileEnvironmentElement(string key, string value) {
              Key = key;
              Value = value;
           }

           [ConfigurationProperty(_appConfigNameKey, DefaultValue = appConfigDefaultString, IsRequired = true, IsKey = true)]
           public string Key {
              get { return (string)this[_appConfigNameKey]; }
              set { this[_appConfigNameKey] = value; }
          }

           [ConfigurationProperty(_appConfigNameValue, DefaultValue = appConfigDefaultString, IsRequired = true, IsKey = false)]
          public string Value {
             get { return (string)this[_appConfigNameValue]; }
             set { this[_appConfigNameValue] = value; }
          }
        }
     }

Вот код, который я использую для сохранения изменения ключа / значения.

* * 1010

Я проверил, и изменения появятся в списке, как и ожидалось. Я попробовал два сохраненных звонка с комментариями плюс последний. Я думаю, что я получаю новый экземпляр FileEnvironmentSection, чтобы избежать проблем с кэшированием ConfigurationManager. После каждого запуска теста я смотрю в MyApp.exe.config и не нахожу никаких изменений. Я что-то упустил и мог бы помочь понять что. Спасибо.

1 Ответ

3 голосов
/ 22 января 2012
appConfiguration.Save(ConfigurationSaveMode.Modified, true);

appConfiguration.Save(ConfigurationSaveMode.Full, true);

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

...