Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
.NET 4.x

Настройки приложения

04.07.2016, 18:06. Показов 3287. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть проект в виде DLL. В нём есть класс с настройками приложения, контролов... Его сериализую и десерализую в XML. Settings не подходят в виду необходимости экспорта-импорта настроек.
Настройки используются во всё приложении в разных случаях. В разных невзаимосвязанных классах.
Вопрос: как лучше всего реализовать такую штуку? Т.е. доступ к настройкам полученным из XML файла.
Варианты, которые использую:
- статичное свойство в основном классе. Десериализуем при инициализации DLL
- статичный класс. Десериализуем при инициализации DLL.
-....
Может где-то не прав? Может стоит брать значения по мере необходимости и создать отдельный обработчик считывания-записи (сериализации-десериализации) из XML?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2016, 18:06
Ответы с готовыми решениями:

Региональные настройки. Стабильность работы приложения на других ПК
Доброго времени суток. Столкнулся со следующей ситуацией. Мною написано несколько программ на C#, которые работают с данными как sql...

Языковые настройки приложения
как лучше всего реализовать систему языковых настроек в приложении? т.е. чтобы в программе можно было менять язык интерфейса? понятно что в...

Куда сохраняются настройки приложения
Здравствуйте друзья. В одном решении есть два проекта: консольное приложение и виндовс приложение. Виндовс приложение второстепенное...

55
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 09:47  [ТС]
Студворк — интернет-сервис помощи студентам
Да хосспади)) ну читайте же сообщения
Цитата Сообщение от Usaga Посмотреть сообщение
настройки нужно задавать в рантайме
Цитата Сообщение от skilllab Посмотреть сообщение
Я даже согласен на не динамическое обновление, с перезапуском... Но только не ручками пользователя заменять файл в AppData
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
05.07.2016, 09:50
skilllab, я не понимаю, что ты хочешь.

Объект с настройками можно сериализовать в XML. Данный XML можно передать на другую машину, десериализовать в объект настроек и передать твоей библиотеки. В рантайме. Как этот XML будет по миру путешевствовать - не важно (для твоей либы точно).

При чём тут AppData?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 10:02  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
я не понимаю, что ты хочешь.
Хочу переносимые настройки приложения, которые были бы видны во всех участках кода приложения, (возможно) без использования статики. Постусловие: настройки, загружаемые из стороннего XML файла не обязательно обновлять в рантайме при импорте, можно и сделать перезапуск приложения для обновления и подгрузки обновлённых. Естественно, сами настройки, загруженные уже в коде - должны быть редактируемы.
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
05.07.2016, 10:07
В любом случае, тебе дали дельный совет - организовать настройку бибилиотеки из вне через объект класса настроек. Процесс получения этого объекта остаётся на совести пользователя (сериализация из XML\JSON или ещё как). Внутри библиотеки модель настроек в виде синглтона или хранимая в корне композии (желательно) и внедряемая в каждый класс библиотеки тем или иным образом (ручками, через статическое свойство SettingModel.Current или DI-контейнером).

Добавлено через 3 минуты
Цитата Сообщение от skilllab Посмотреть сообщение
Хочу переносимые настройки приложения, которые были бы видны во всех участках кода приложения
Цитата Сообщение от Usaga Посмотреть сообщение
Внутри библиотеки модель настроек в виде синглтона или хранимая в корне композии (желательно) и внедряемая в каждый класс библиотеки тем или иным образом (ручками, через статическое свойство SettingModel.Current или DI-контейнером).
Цитата Сообщение от skilllab Посмотреть сообщение
настройки, загружаемые из стороннего XML
Цитата Сообщение от Usaga Посмотреть сообщение
организовать настройку бибилиотеки из вне через объект класса настроек. Процесс получения этого объекта остаётся на совести пользователя
Цитата Сообщение от skilllab Посмотреть сообщение
Естественно, сами настройки, загруженные уже в коде - должны быть редактируемы.
Цитата Сообщение от Usaga Посмотреть сообщение
Внутри библиотеки модель настроек в виде синглтона или хранимая в корне композии
Ответы же дали тебе)
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 10:11  [ТС]
Меня только это смутило
Цитата Сообщение от Psilon Посмотреть сообщение
Поэтому да - прокидывать объекты, который дочерним объектам будет прокидывать свои кусочки...
Но дальше
Цитата Сообщение от Psilon Посмотреть сообщение
Если лень прокидывать самому, используют IOC-контейнеры
Что, по ходу, подойдёт как нельзя лучше. Почему и спросил чуть ниже про ссылки.
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
05.07.2016, 10:15
Цитата Сообщение от skilllab Посмотреть сообщение
Что, по ходу, подойдёт как нельзя лучше. Почему и спросил чуть ниже про ссылки.
Вот пример использования Ninject.

Идея там в том, что ты настраиваешь некую "штуку" на выдачу объектов нужных тебе классов. И потом, когда такие объекты тебе становятся нужны, ты их не создаёшь через оператор new, а запрашиваешь у "штуки". Эта штука смотрит на конструктор запрошенного объекта и сама создаёт и передаёт в него требуемые объекты классов. Если тем тоже нужны какие-то аргументы, то и они пытаюстся разрешиться. И так в цикле, пока не будет разрешён весь граф зависимостей.

Как-то так.
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 19:23  [ТС]
Собственно, не хватало лишь одной ссылки в теме по теме. И.... православный app.config и экспорт-импорт:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
 
public static class SettingsIO
{
    internal static void Import(string settingsFilePath)
    {
        if (!File.Exists(settingsFilePath))
        {
            throw new FileNotFoundException();
        }
 
        var appSettings = Properties.Settings.Default;
        try
        {
            var config = 
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal);
 
            string appSettingsXmlName = 
Properties.Settings.Default.Context["GroupName"].ToString(); 
// returns "MyApplication.Properties.Settings";
 
            // Open settings file as XML
            var import = XDocument.Load(settingsFilePath);
            // Get the whole XML inside the settings node
            var settings = import.XPathSelectElements("//" + appSettingsXmlName);
 
            config.GetSectionGroup("userSettings")
                .Sections[appSettingsXmlName]
                .SectionInformation
                .SetRawXml(settings.Single().ToString());
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("userSettings");
 
            appSettings.Reload();
        }
        catch (Exception) // Should make this more specific
        {
            // Could not import settings.
            appSettings.Reload(); // from last set saved, not defaults
        }
    }
 
    internal static void Export(string settingsFilePath)
    {
        Properties.Settings.Default.Save();
        var config = 
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal);
        config.SaveAs(settingsFilePath);
    }
}
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
05.07.2016, 19:50
skilllab, какой ужас...

Всего-то нужно было создать нормальный синглтон со всеми настройками и сериализовать\десериализовать в отдельный XML-файл, а не городить этот ужас.

Две страницы прообщались с тобой в пустую
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 19:59  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Две страницы прообщались с тобой в пустую
Не в пустую, я теперь рою IoC.
А чем вышеприведённый ужасен?

Добавлено через 7 минут
app.config - есть.
экспорт/импорт - есть.
Где ужас то? Что я (накой я так и не понял) не "предоставил интерфейс" пользователю/тыкателю, который настройки то изменяет в специально сделанном для него окошке?
Или что не использовал синглтон или DI вместо штатного Properties.Settings.Default

Я вот сейчас серьёзно - где ужас?
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
05.07.2016, 19:59
Цитата Сообщение от skilllab Посмотреть сообщение
А чем вышеприведённый ужасен?
Да всем: применением статического класса там, где нужен обычный, но в одном экземпляре; использование внешнего конфигурационного файла вместе с app.config (обычно используется что-то одно) в какой-то дико запутанной манере; internal методы public класса и т.д...
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 20:01  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
использование внешнего конфигурационного файла вместе с app.config
эмм...чего?
--------------------------------------------
По вашей же ссылке для синглтона
Основное назначение статических классов все-таки в группировке логически схожих методов
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
05.07.2016, 20:05
app.config и Properties.Settings используются для быстрой и простой организации настроек. Для чего-то сложного и серьёзного их не используют. Хорошим тоном является (устал уже повторять) создание своего простого класса с настройками (в виде свойств) и сохранение\загрузка его в отдельный файл в любом удобном формате.

Я не настаиваю на DI-контейнерах и синглтонах с интерфейсами. Просто сама идея работать с настройками так, как это делаешь ты - крайне плоха.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.07.2016, 20:06
skilllab, зачем вы вообще используете app.config?
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
05.07.2016, 20:08
Цитата Сообщение от skilllab Посмотреть сообщение
использование внешнего конфигурационного файла вместе с app.config
Если у тебя уже есть файл с настройками (ты из него делаешь импорт), то app.config тебе не нужен! Просто бери настройки из того файла, не городи свалку

Цитата Сообщение от skilllab Посмотреть сообщение
Основное назначение статических классов все-таки в группировке логически схожих методов
Да, схожих методов не имеющих общего состояния. Настройки ещё как имеют состояние. Просто ты его перезапихнул в Properties.Settings...
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 20:10  [ТС]
Psilon, несколько параметров для RGB (каждый цвет в своё свойство), несколько триггеров для чекбоксов, несколько текстовых свойств (что-то вроде "имя папки отчёта")

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Просто бери настройки из того файла
Я и брал.
Не, это утомительно...прочитайте тему и первое сообщение. Желательно в хронологии. Чтобы увидеть где именно начались советы по уходу от статики.
0
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
05.07.2016, 20:17
Цитата Сообщение от skilllab Посмотреть сообщение
Я и брал.
И перезасовывал ещё дальше, вместо того, чтобы сразу использовать

Добавлено через 4 минуты
skilllab, тебе не нужен app.config и Properties.Settings. Ты сам это можешь сделать, без костылей. Вот пример простейшего класса с настройками (без сохранения):

C#
1
2
3
4
5
6
7
8
9
10
11
12
public class MySettings
{
    public static MySettings Current {get;set;}
 
    static MySettings()
    {
        Current = new MySettings();
    }
 
    public string Setting1{get;set;}
    public int SomeIntOption{get;set;}
}
Он доступен всему твоему коду и не требует наличия app.config.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 20:22  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Вот пример
Вот ты упёртый))
Цитата Сообщение от skilllab Посмотреть сообщение
есть класс с настройками приложения, контролов... Его сериализую и десерализую в XML.
Эта цитатка хоть что-то тебе говорит?

Цитата Сообщение от Usaga Посмотреть сообщение
тебе не нужен
А теперь без DI, интерфейсов и прочего синглтона попробуй использовать его в 10 классах, половина из которых не знает о существовании друг друга.

Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Для чего-то сложного и серьёзного их не используют.
Так укажи мне грань то когда 2 триггера в настройках (это означает что есть 2 свойства в настройках с типом bool, и отвечают они за вкл или выкл) перерастают во что-то серьёзно?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.07.2016, 20:22
Лучший ответ Сообщение было отмечено skilllab как решение

Решение

skilllab, я пример набросал, вообще я что-то в таком духе имел ввиду. Как потом куда пробрасывать - дело десятое, но мое представление что должно быть как-то так:
Вложения
Тип файла: zip SettingsTest.zip (3.28 Мб, 9 просмотров)
1
Эксперт .NET
 Аватар для Usaga
14773 / 9548 / 1365
Регистрация: 21.01.2016
Сообщений: 36,001
05.07.2016, 20:22
Цитата Сообщение от skilllab Посмотреть сообщение
А теперь без DI, интерфейсов и прочего синглтона попробуй использовать его в 10 классах, половина из которых не знает о существовании друг друга.
Легко:

C#
1
2
MySettings.Current.SomeOption = 10; //так можно обратиться к твоим настройкам из любого места в коде
//после этой строки все классы увидят в этой настройке 10
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.07.2016, 20:23
Цитата Сообщение от skilllab Посмотреть сообщение
Так укажи мне грань то когда 2 триггера в настройках (это означает что есть 2 свойства в настройках с типом bool, и отвечают они за вкл или выкл) перерастают во что-то серьёзно?
Вопрос из разряда "сколько камней - кучка".

Цитата Сообщение от skilllab Посмотреть сообщение
А теперь без DI, интерфейсов и прочего синглтона попробуй использовать его в 10 классах, половина из которых не знает о существовании друг друга.
А что мешает? У меня сейчас подобный проект с кучей настроек без синглтона работает, и там не 10 классов, там одних проектов 85 штук в солюшене. И всем нужны настройки.

Да, статикой можно синглтон делать. Но от этого начинаются проблемы, т.к. он не может реализовывать интерфейс, о чем я уже говорил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2016, 20:23

Где в UWP хранить настройки приложения?
В WPF есть Setting.setting а в UWP нету в Properties

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

Сохранить настройки в событии Shutdown приложения
Добрый день, товарищи!! Читаю в "события приложения" "' Shutdown: возникает после закрытия всех форм приложения. Это событие не...

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

Сохраняем настройки приложения средствами Visual Studio
Привет, я хотел бы рассказать о новой возможности. Начиная с версии framework 2.0, существует возможность сохранения настроек в сам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть не большие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru