#c# #.net #visual-studio-2010 #configuration #appsettings
#c# #.net #visual-studio-2010 #конфигурация #настройки приложений
Вопрос:
Я ищу наилучшую практику для управления конфигурацией в проекте с несколькими библиотеками классов. Я ищу удобство обслуживания и простоту реализации.
Давайте рассмотрим простой пример: консольный проект с 2 библиотеками классов. Каждой библиотеке классов нужны свои собственные настройки конфигурации, и есть некоторые настройки, которые являются общими для нескольких.
Библиотека классов 1
- Настройка cl1
- Глобальная настройка
Библиотека классов 2
- CL2Setting
- Глобальная настройка
Первым подходом было бы создать все необходимые настройки в основном проекте:
- Глобальная настройка
- Настройка cl1
- CL2Setting
Но это создает несколько проблем:
- При большом количестве настроек он может быстро загромождаться.
- Это непросто поддерживать: как узнать, какие настройки необходимы для каждой библиотеки?
- Это может привести к конфликтам именования. Что, если CL1Setting и CL2Setting будут иметь одно и то же имя?
Идеальным решением для меня (хотя, боюсь, это невозможно) было бы иметь пользовательские настройки библиотеки в отдельных файлах или, по крайней мере, в разных разделах. Что-то вроде этого:
<configuration>
<appSettings>
<add key="globalSetting" value="cl1Global"/>
</appSettings>
<appSettings file="CL1.config" >
<add key="cl1setting" value="cl1setting1"/>
</appSettings>
<appSettings file="CL2.config">
<add key="cl2setting" value="cl2setting2"/>
</appSettings>
</configuration>
Есть предложения?
Редактировать
Как предлагает Кен Хендерсон, разделы конфигурации — это другой подход. Однако, несмотря на свои преимущества, они требуют кодирования, поэтому я не нахожу это идеальным. (Хотя это, вероятно, в конечном итоге будет лучшим вариантом)
РЕДАКТИРОВАТЬ 2
джозеф.феррис предлагает посмотреть на конструктор разделов конфигурации в CodePlex (csd.codeplex.com ) было хорошо. Я обнаружил дополнительные проблемы, о которых сообщается здесь (в случае, если кому-то интересно)http://csd.codeplex.com/discussions/278354
Ответ №1:
Я думаю, что вы ищете пользовательский раздел конфигурации вместо настроек приложений. Это обычно используется сторонними библиотеками (log4net — первое, что приходит на ум), чтобы предоставить способ настройки их параметров через ваше приложение / файл веб-конфигурации. Обратите внимание, что это также обеспечивает основу для того, как MS создает свои разделы конфигурации.
Я успешно использовал это в нескольких разных проектах, включая тот, который включал возможность добавления новых реализаций алгоритмов в программу анализа.
Комментарии:
1. Спасибо! Это еще один подход, который я изучил, но забыл включить в ответ (я отредактирую его). Это хорошо, но для этого требуется написать код, а не просто добавить настройки в файл конфигурации. Я нахожу это немного громоздким 🙂
2. rgargente — Посмотрите на конструктор разделов конфигурации в CodePlex ( csd.codeplex.com ). Визуальный дизайн разделов конфигурации и простой доступ к содержимому через одноэлементную реализацию. Я использую его постоянно и больше никогда не буду кодировать раздел конфигурации вручную.
3. Я пробовал это. Кажется, все в порядке до времени выполнения. Эта ошибка сводит меня с ума: произошла ошибка при создании обработчика раздела конфигурации для FooConfigSection
4. Решил это. Я снова отредактирую вопрос. Сообщение об ошибке здесь: csd.codeplex.com/discussions/278354
Ответ №2:
Вы могли бы использовать свое собственное соглашение об именовании, чтобы снизить риск конфликтов имен приложений. И / или создавать пользовательские разделы конфигурации.
<configuration>
<appSettings>
<add key="Shared.Setting1" value="..."/>
<add key="CL1.setting1" value="..."/>
<add key="CL1.setting2" value="..."/>
<add key="CL2.setting1" value="..."/>
<add key="CL2.setting2" value="..."/>
</appSettings>
</configuration>
Я не уверен, что администратору нужно знать, какой параметр принадлежит какой библиотеке, но соглашение об именовании помогает продвигать логическую группировку — я бы использовал значимые для администратора префиксы, а не произносил имя библиотеки классов — например, «Ведение журнала». для настроек приложений, связанных с ведением журнала.
Комментарии:
1. Я видел, что вы используете точку в качестве разделителя. Сами Microsoft используют двоеточие в качестве разделителя. Как вы можете видеть в некоторых из их примеров Azure, где у них есть префикс
ida:
.2. @Fred, я согласен, стоит быть последовательным, поэтому двоеточие — хороший выбор, поскольку Microsoft использует его. Однако Microsoft сама не является согласованной — например, настройки приложений MVC, такие как ClientValidationEnabled и UnobtrusiveJavaScriptEnabled, не имеют никакого префикса.
Ответ №3:
Microsoft использует двоеточие в качестве разделителя пространства имен в некоторых своих кодах. Пример их образцов Azure. Здесь они используют ida:
в качестве префикса.
ConfigurationManager.AppSettings["ida:ClientId"];
В Microsoft ASP.NET в файле Web.config вы можете увидеть:
<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>