Best practice работы с настройками приложения

Криптовалютный Хайп

Всем привет! Интересует best practice работы с настройками (desktop приложение), чтение-запись настроек, а также создание настроек в run-time.
24 ответа

Криптовалютный Хайп

Всем привет! Интересует best practice работы с настройками (desktop приложение), чтение-запись настроек
обычные стандартные Application Settings
а также создание настроек в run-time.
А код для использования созданных в рантайме настроек тоже будет генерироваться в рантайме?


Криптовалютный Хайп

Сон Веры Павловны,ну вообще есть такой класс ConfigurationManager, где можно и добавлять и удалять настройки и код в рантайме не нужно генерировать. Другое дело, как код будет эти настройки обрабатывать, если он о них ничего не знает. Но возможно там модульная архитектура, а конфигурация для всех модулей одна. Или еще какое извращение.Или настройки нужны для каких то пользовательских отчетов и подобных вещей. По моему, вполне нормальная хотелка у автора :)


Криптовалютный Хайп

Криптовалютный Хайп,Смотря какие настройки.


Криптовалютный Хайп

Сон Веры Павловны,ну вообще есть такой класс ConfigurationManager, где можно и добавлять и удалять настройки
А можно конкретнее - какие именно методы это делают? Вот ConfigurationManager, вот Configuration - в упор не вижу ничего для создания новых настроек.


Криптовалютный Хайп

Сон Веры Павловны,создаете config файл и конфигурируйте свои настройки как хотите, если надо добавлять удалять, создаете в Settgins нужные параметры с ключами, профит. вроде как создать файл .config через менеджер нельзя, но можно открыть и редактировать


Криптовалютный Хайп

Сон Веры Павловны,создаете config файл и конфигурируйте свои настройки как хотите, если надо добавлять удалять, создаете в Settgins нужные параметры с ключами, профит.
Ну, то есть уже не посредством ConfigurationManager, а редактированием конфига, так?
вроде как создать файл .config через менеджер нельзя, но можно открыть и редактировать
Ага, редактировать можно. Только толку от этого мало - при попытке, например, удалить настройку, вы всего лишь добъетесь того, что будет использоваться дефолтное значение настройки из атрибута DefaultSettingValueAttribute. А для редактирования настройки со Scope=User нужно реадктировать не от конфиг, который рядом с приложением, а тот, который в LocalAppData по достаточно нетривиальному пути. Проще уж свою систему настроект с XML-сериализацией написать. Но и она не позволит работать с динамически создаваемыми настройками из кода.


Криптовалютный Хайп

Динамические юзерские настройки
/// <span><<span>summary</span>></span>
 /// Прочитать из файла конфигурации приложения "User Параметр" с именем Name<span><<span>para</span>></span>Если параметра нет, то он создасться<span><<span>/</span><span>para</span>></span>
 /// <span><<span>/</span><span>summary</span>></span>
 /// <span><<span>param</span> <span>name</span><span>=</span><span>"Name"</span>></span>Имя параметра<span><<span>/</span><span>param</span>></span>
 /// <span><<span>param</span> <span>name</span><span>=</span><span>"DefaultValue"</span>></span>Не должно быть null, со встроенным типом.<span><<span>/</span><span>param</span>></span>
 /// <span><<span>returns</span>><<span>/</span><span>returns</span>></span>
 public static object GetParam(string Name, object DefaultValue)
 {
 object v = DefaultValue;
 if (DefaultValue != null)
 {
 try
 { 
 v = KPKcontrols.Properties.Settings.Default[Name];
 }
 catch (System.Configuration.SettingsPropertyNotFoundException)
 {
 System.Configuration.SettingsProperty property = new System.Configuration.SettingsProperty(Name);
 property.SerializeAs = System.Configuration.SettingsSerializeAs.Xml;
 property.DefaultValue = DefaultValue;
 property.IsReadOnly = false;
 property.PropertyType = DefaultValue.GetType();

 property.Provider = KPKcontrols.Properties.Settings.Default.Providers["LocalFileSettingsProvider"];
 property.Attributes.Add(typeof(System.Configuration.UserScopedSettingAttribute), new System.Configuration.UserScopedSettingAttribute());

 KPKcontrols.Properties.Settings.Default.Properties.Add(property);
 KPKcontrols.Properties.Settings.Default.Reload();

 v = KPKcontrols.Properties.Settings.Default[Name];
 }
 }
 return v;
 }
 
 /// <span><<span>summary</span>></span>
 /// Записать в файл конфигурации приложения "User Параметр" с именем Name<span><<span>para</span>></span>Если параметра нет, то он создасться<span><<span>/</span><span>para</span>></span>
 /// <span><<span>/</span><span>summary</span>></span>
 /// <span><<span>param</span> <span>name</span><span>=</span><span>"Name"</span>></span>Имя параметра<span><<span>/</span><span>param</span>></span>
 /// <span><<span>param</span> <span>name</span><span>=</span><span>"Value"</span>></span>Не должно быть null (если null, то ошибки не возникает), с простым типом<span><<span>/</span><span>param</span>></span>
 public static void SaveParam(string Name, object Value)
 {
 if (Value == null)
 return;
 try
 {
 object v = KPKcontrols.Properties.Settings.Default[Name];
 KPKcontrols.Properties.Settings.Default[Name] = Value;
 KPKcontrols.Properties.Settings.Default.Save();
 }
 catch (System.Configuration.SettingsPropertyNotFoundException)
 {
 System.Configuration.SettingsProperty property = new System.Configuration.SettingsProperty(Name);
 property.SerializeAs = System.Configuration.SettingsSerializeAs.Xml;
 property.DefaultValue = String.Empty;
 property.IsReadOnly = false;
 property.PropertyType = Value.GetType();

 property.Provider = KPKcontrols.Properties.Settings.Default.Providers["LocalFileSettingsProvider"];
 property.Attributes.Add(typeof(System.Configuration.UserScopedSettingAttribute), new System.Configuration.UserScopedSettingAttribute());

 KPKcontrols.Properties.Settings.Default.Properties.Add(property);
 KPKcontrols.Properties.Settings.Default.Reload();

 KPKcontrols.Properties.Settings.Default[Name] = Value;
 KPKcontrols.Properties.Settings.Default.Save();
 }
 }


Криптовалютный Хайп

Только юзерские настройки, они и есть юзерские их применяют обычно, например для сохранения каких-либо параметров внешнего вида и тд и тп.


Криптовалютный Хайп

fortibransa,Ключевой вопрос: "Зачем динамические"?


Криптовалютный Хайп

fortibransa,Ключевой вопрос: "Зачем динамические"?
Я сохраняю размер колонок грида, размер и положение форм и тл и тп.Саму реализацию конечно можно переделать без try catch, но работает, да и ладно :)


Криптовалютный Хайп

Кстати не юзерские настройки сохранять нельзя, но при необходимости их можно менять.
Properties.Settings.Default.Connect = newConnection //так нельзя
Properties.Settings.Default["Connect"] = newConnection //а так можно


Криптовалютный Хайп

Я сохраняю размер колонок грида, размер и положение форм и тл и тп.Саму реализацию конечно можно переделать без try catch, но работает, да и ладно :)
а где динамика?Properties.Settings.Default.ColumnsW = "12;22;567;44"


Криптовалютный Хайп

fortibransa,По хорошему, грид это отдльная песня. Он сам себя должен сохранять, напр. в реестре.


Криптовалютный Хайп

а где динамика?Properties.Settings.Default.ColumnsW = "12;22;567;44"
А у тебя один грид на приложение?


Криптовалютный Хайп

fortibransa,По хорошему, грид это отдльная песня. Он сам себя должен сохранять, напр. в реестре.
дело хозяйское. Кстати в моем случае, если приложение поменяет версию, то настройки те, тю тю.


Криптовалютный Хайп

fortibransa,Ниже же дан ответ про реестр.


Криптовалютный Хайп

. Кстати в моем случае, если приложение поменяет версию, то настройки те, тю тю.
иногда удобно.


Криптовалютный Хайп

Динамические юзерские настройки
Ну вот примерно этого я и хотел от Романа.Но для того же сохранения настроек грида - слишком хардкорно. Класс параметров грида, сериализация его в xml, и сохранение в одной-единственной нединамической настройке с типом XmlDocument намного проще и прозрачнее.


Криптовалютный Хайп

Ну вот примерно этого я и хотел от Романа.Но для того же сохранения настроек грида - слишком хардкорно. Класс параметров грида, сериализация его в xml, и сохранение в одной-единственной нединамической настройке с типом XmlDocument намного проще и прозрачнее.
Во первых гридов много, насчет прозрачнееи проще вопрос еще тот, а зачем тут прозрачность, сохраняет, работает, что еще надо?


Криптовалютный Хайп

Вера Павловна, все хорошо, а я не знаю что, я буду сохранять и тратить время на огород специально для грида (у меня просто два простеньких метода), для сплита, для... На фига? Что в бошку пришло и оно уже функцианирует. Да, тут мтип сериализации заменить на binary и вообще что хошь храни. И Ваш xmlDocumemt в том числе.


Криптовалютный Хайп

обычные стандартные Application Settings
Лично я это никогда не использую, хотя бы потому что настройки редактируемые из .Net -морды потом считываются из C++ приложения.
про реестр
Реестр, ДА.Но я от него несколько лет назад частично отказался по некоторым соображениям в пользувообще классического ini-файла настроекWritePrivateProfileString GetPrivateProfileString GetPrivateProfileIntИ очень кстати удобно.ИМХО, в реестре разумно хранить координаты-размеры формы под Current User и т.п. но не более.


Криптовалютный Хайп

реестре разумно хранить координаты-размеры формы под Current User и т.п. но не более.
а мы про них и говорим.Про то что стирается на кнопу Настройки - По умолчанию.


Криптовалютный Хайп

считываются из C++ приложения.
экзотика


Криптовалютный Хайп

Дмитрий77,Сохрани класс в реестре.А сеттинг NET в легкую