Есть ли способ обеспечить, чтобы библиотека классов использовала его собственные настройки приложения?

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

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

Я хотел бы убедиться, что библиотека классов использует собственный файл appsettings, а также что он не вносит изменений в настройки приложения веб-приложения.

Возможно ли это? Кажется, что любая сборка может изменить настройки приложения через ConfigurationManager.

EDIT. Чтобы предоставить контекст, библиотека классов обращается к узлу уровня данных (который я не могу изменить), который использует значение в appSettings для получения строки подключения. Единственная проблема заключается в том, что ключ такой же, как строка подключения к веб-приложению (которая может иметь или не иметь другое значение).

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

Ответ 1

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

Ответ 2

Нет никакого способа сделать это. Это просто не работает .NET.

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

Ответ 3

Вместо использования файла app/web.config рассмотрите вопрос о создании собственного класса настроек, который наследуется от System.Configuration.SettingsBase.

Затем ваша библиотека классов может создать экземпляр этой реализации в ConfigurationBase и управлять своими настройками, не мешая настройкам, которые могут потребоваться в другом месте.

http://msdn.microsoft.com/en-us/library/system.configuration.settingsbase.aspx

Класс настроек будет выглядеть примерно так:

sealed class MySettings : SettingsBase
{
    [ApplicationScopedSetting()]
    [DefaultSettingValue("Default")]
    public string MySetting
    {
        get { return this["MySetting"].ToString(); }
        set { this["MySetting"] = value; }
    }
}

Ответ 4

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

 // Map the new configuration file.
 var configFileMap = new ExeConfigurationFileMap();
 configFileMap.ExeConfigFilename = configFile;

 // Get the mapped configuration file
 Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
    configFileMap, ConfigurationUserLevel.None);

Здесь config предоставит вам доступ к AppSettings, ConnectionStrings и Sections. Вы можете создать абстракцию поверх доступа к ConfigurationManager, чтобы вы могли контролировать его доступ и, таким образом, сделать его более проверяемым, но это зависит от дизайна.

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

Ответ 5

Назовите свой конфигурационный файл, как показано ниже, и поместите его в ту же папку, что и ваша сборка: [AssemblyName].dll.config

Обновление: Можно использовать все, что доступно. Вы также используете AppSettingsReader (http://msdn.microsoft.com/en-us/library/system.configuration.appsettingsreader.aspx) для создания пользовательских настроек.

Пример:

<configuration>
  <appSettings>
    <add key="YourCustomSetting" value="10240" />
  </appSettings>

  <system.diagnostics>
    ...
  </system.diagnostics>

  <connectionStrings>...
  <system.web>...
  etc, etc.
</configuration>