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

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

04.07.2016, 18:06. Показов 2889. Ответов 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
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2016, 18:34
skilllab, в свое время тоже думал, че это не завезли app.config для dll-ок, было бы так удобно!
Но потом пришел к выводу, что это не так (ну и не только я пришел, умные люди объяснили).
Вот есть у вас одна DLL-ка, скажем JSON.Net - один человек хочет использовать сериализацию в формате день-месяц-год, а другой: месяц/день/год. Как им быть, Dll-ка то одна? А очень просто - вызвать сериализацию с разными параметрами, которые у каждого приложения свои.

Вывод: нужно предоставить программные АПИ конфигурирования вашей DLL, а конфигурационный файл это не ваша забота, а забота потребителей этого проекта. Может они не в XML, а в JSON хотят сериализовывать, или вообще захардкодить, зачем вы их ограничиваете
3
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
04.07.2016, 18:37  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
конфигурационный файл это не ваша забота
Не всё так плохо я сам даю пользователям только окошечко с настройками. Никаких их "отсебятин".
Вопрос лишь в том, чтобы стучаться к настройкам из любого места кода (округление там задать для текстбокса...цвет тултипа... ). Ну а сериализация - чтоб типа проще туда сюда по машинам гонять.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2016, 19:04
skilllab, у DLL нет никаких окошек, это просто набор методов, условно
Если конечно это не UI-компонент, но там нужно взаимодействовать с чужими просмотрщиками (например студийным), а не изобретать свой.

Настройка из любого места - ну если приложению нужно, пусть при запуске загружает в синглтон - библиотека по возможности не должна зависить от приложения, она должа быть стейтлесс.

Цитата Сообщение от skilllab Посмотреть сообщение
Ну а сериализация - чтоб типа проще туда сюда по машинам гонять.
А тут вообще никаких проблем:
C#
1
string networkSettings = JsonConvert.Serialize(MySettingsSignletone); // и понеслася
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
04.07.2016, 19:22  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Signletone
Цитата Сообщение от skilllab Посмотреть сообщение
статичный класс
как то так

Добавлено через 44 секунды
Цитата Сообщение от Psilon Посмотреть сообщение
у DLL нет никаких окошек
Есть. Она не тупо набор методов, она аж ActiveX компонент со всей визуально-панельной требухой и кучей "всяких классов".
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2016, 19:47
skilllab, синглтон будет для приложения, а не для DLL.

Ну и у статического класса есть большие проблемы - он не может реализовывать интерфейс. Вы же надеюсь не отдаете вместо интерфейсов клиенту объекты?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
04.07.2016, 19:56  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
не отдаете вместо интерфейсов клиенту объекты
Да нет у клиента ничего. Никакого API. Есть ActiveX компонент, который установщиком зареган в системе и встроен в приложение. Всё. Клиент только "тыкатель" кнопок.

Добавлено через 6 минут
Цитата Сообщение от Psilon Посмотреть сообщение
он не может реализовывать интерфейс
И этого мне вроде как не нужно. Цель прочитать (везде) - записать (везде) в условиях родного кода. Значит, альтернатива app.config это экземпляр класса. Это я назвал в первом сообщении первым в списке.
Типа:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
       public static GlobalSettings mySettings;
...
       public Initialize()
       {
         ...
         mySettings = new GlobalSettings();
         ...
       }
}
Somewhere...
{
MainClass.mySettings.RoundQuantity
}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2016, 20:01
skilllab, вам нужно просто конструктор с параметром настроек вызвать же Зачем статику вовлекать?
Цитата Сообщение от skilllab Посмотреть сообщение
Значит, альтернатива app.config это экземпляр класса. Это я назвал в первом сообщении первым в списке.
у человека вообще может не быть доступа к файловой системе (например если он удаленно сидит). И если в случае приложения это проблема среды, то в случае dll она не должна на это рассчитывать.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
04.07.2016, 20:03  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
конструктор с параметром настроек вызвать же
(если вы сейчас про Properties.Settings.Default) Как потом оное сериализовывать?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2016, 20:05
Цитата Сообщение от skilllab Посмотреть сообщение
(если вы сейчас про Properties.Settings.Default)Как потом оное сериализовывать?
Нет я не про это. Я про то, чтобы
1. сделать интефрейс IMyCoolSettings.
2. в этом интерфейсе определить все нужные свойства (например RoundQuantity)
3. в конструкторе сделать параметр типа IMyCoolSettings и инициализировать библиотеку в зависимости от него.
4. в вызывающей сборке (возможно это ваша же будет) сделать наследника от IMyCoolSettings и передавать в конструктор.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
04.07.2016, 20:27  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
не быть доступа к файловой системе
Максимум - это может быть домен. На этот случай
C#
1
Environment.SpecialFolder.ApplicationData
с файликом XML в папочке с именем приложения.

Добавлено через 3 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
сделать наследника от IMyCoolSettings
уфф...закручено
Цитата Сообщение от Psilon Посмотреть сообщение
и передавать в конструктор
в конструктор сборки? Я ж пишу, что есть ещё куча независимых классов, так что ж теперь таскать за собой IMyCoolSettings в параметрах их конструкторов?
Настройки используются во всём приложении в разных случаях

Добавлено через 4 минуты
Если вдруг какому то замшелому методу, который зарыт где-то глубоко в логике, вдруг понадобится узнать этот RoundQuantity, то мне аж на весь этот класс с методом передавать ссылку на MyCoolSettings? А вдруг многопоточность?
и в то время когда я буду закрывать свою панельку с сохранением настроек где то код будет допиливать метод с инстансом и RoundQuantity...

Добавлено через 2 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
Я про то, чтобы
С этим трудно не согласиться для всяких последующих расширений, но что дальше то? Как мне получать настройки в непроизводных и в независимых классах? Этот вопрос, собственно, и описан в самом первом сообщении, а не как грамотно предоставить сторонним разработчикам доступ к настройкам сборки (что-то вдруг показалось омериканское .. thread hijacking )

Добавлено через 11 минут
Цитата Сообщение от Psilon Посмотреть сообщение
у человека вообще может не быть доступа к файловой системе
Да не надо дополнительных условий в топик))) всё описано в первом сообщении.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2016, 21:19
Цитата Сообщение от skilllab Посмотреть сообщение
Максимум - это может быть домен. На этот случай
Окей, система запущена на рамдиске, жесткого диска нет вообще - ваши действия?
Цитата Сообщение от skilllab Посмотреть сообщение
в конструктор сборки? Я ж пишу, что есть ещё куча независимых классов, так что ж теперь таскать за собой IMyCoolSettings в параметрах их конструкторов?
Ну да. Я конечно понимаю, что приятно иметь один глобальный статический класс, из которого в любой момент можно прочитать любое значение (и записать свое), но обычно это плохо кончается. Поэтому да - прокидывать объекты, который дочерним объектам будет прокидывать свои кусочки... При правильной декомпозиции получается красиво и понятно.

Если лень прокидывать самому, используют IOC-контейнеры, это все то же самое, только компилятор сам сгенерирует необходимые "пробросы".

Если вам придется все это добро дебажить в поисках ошибки, то зависимость от глобального состояния вам подложит большую свинью, ибо отладить приложения не зная этого состояния вы не сможете.

Добавлено через 1 минуту
Но конечно можете оставить все как есть. Разработчики вообще ленивые люди - и это хорошо. Главное, чтобы лень в текущий момент не стоила времени в будущем.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
04.07.2016, 22:02  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Окей
опять новые условия))) Не надо.
Цитата Сообщение от Psilon Посмотреть сообщение
используют IOC-контейнеры
Ну, с интерфейсами то сейчас тоже заморочился, а вот DI никак не понять. Точней на хэллоуворде вроде начинаю понимать, но как только что-то сложнее идёт - сразу nuget и куча кода в стиле "ну тут всё понятно...идём дальше"
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2016, 22:48
Цитата Сообщение от skilllab Посмотреть сообщение
Ну, с интерфейсами то сейчас тоже заморочился, а вот DI никак не понять. Точней на хэллоуворде вроде начинаю понимать, но как только что-то сложнее идёт - сразу nuget и куча кода в стиле "ну тут всё понятно...идём дальше"
Да там как раз все понятно, в том смысле что вы везде используете вышеописанную тактику "пробрасывать интерфейсы вглубь", а на самом высоком уровне у вас интерфейсы получаются через резолвер DI. Ну и еще где-то выше, выше чем точка запуска приложения, в сфере инициализаторов типов у вас прописано, какие интерфейсы на какие классы биндятся. Не уверен, что для вашей задачи это нужно (все-таки это решение для тяжелых приложений, у вас скорее всего проще тупо руками все это делать), но тут уже как захотите. Программирование многогранная сфера, в том числе и творческая.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
05.07.2016, 07:11  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
а на самом высоком уровне у вас интерфейсы получаются через резолвер DI
На более менее внятный пример можете дать ссылку? А то одни ASP да репозитории.
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
05.07.2016, 08:53
skilllab, можно, как вариант, скомбинировать предложенный мисье Psilon-ом метод с минимальными правками кода (без использования DI и прочего). Предусмотреть в твоей библиотеке некий менеджер настроек видимый внешнему коду, который можно сконфигурировать из приложения с помощью того же IMyCoolSettings. А весь остальной код библиотеки будет брать настройки из этого менеджера (будет он синглтоном или статическим классом (фу-фу-фу) или ещё как-то раздавать настройки - приложению уже будет всё равно - это останется на совести самой библиотеки).

Можно будет и библиотеку настраивать гибким образом (без app.config или другого внешнего файла) и все классы твоей библиотеки в ручную снабжать зависимостями не понадобится. Но такое решение элегантным назват рука не поднимется Просто компромис между "правильно" и "быстро".

Добавлено через 6 минут
Ну и, конечно, остаётся вариант доступа классов из библиотеки к настройкам в app.config самого приложения через класс System.Configuration.ConfigurationManage r.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
05.07.2016, 09:09  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
остаётся вариант
Судя по словам того же мисье Psilon - это является православно-каноническим методом хранения настроек Да я бы и не против, если бы знать толковый метод экспорта/импорта этого app.config с последующим обновлением настроек приложения. Я даже согласен на не динамическое обновление, с перезапуском. Но только не ручками пользователя заменять файл в AppData, как только туда полезут - беда.
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
05.07.2016, 09:14
skilllab, православно-каноническим методом хранения настроек для DLL-ки является получение их (настроек) от приложения прямо в коде. Как само приложение будет их хранить - уже дело десятое.

Цитата Сообщение от skilllab Посмотреть сообщение
если бы знать толковый метод экспорта/импорта этого app.config
Куда и зачем этот файл экспортировать? Доступ к его содержимуому можно получить через класс System.Configuration.ConfigurationManage r.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
05.07.2016, 09:31  [ТС]
Как то так:
Цитата Сообщение от Usaga Посмотреть сообщение
Куда и зачем
Цитата Сообщение от skilllab Посмотреть сообщение
Ну а сериализация - чтоб типа проще туда сюда по машинам гонять.
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
05.07.2016, 09:38
skilllab, если настройки нужно задавать в рантайме, то тут только конфигурирование библиотеки через код (приём с IMyCoolSettings).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2016, 09:38
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru