Ответ 1
Я полагаю, что отдельный домен приложения может использовать другой файл конфигурации. Я не знаю, как это сделать.
В настоящее время у меня есть библиотека классов, и вам понадобятся ее собственные настройки, и, вероятно, им потребуется изменить их и прочее.
Единственная проблема заключается в том, что класс будет вызываться веб-приложением, которое имеет файл appsettings, который также имеет идентичные ключи к настройкам приложения библиотеки классов.
Я хотел бы убедиться, что библиотека классов использует собственный файл appsettings, а также что он не вносит изменений в настройки приложения веб-приложения.
Возможно ли это? Кажется, что любая сборка может изменить настройки приложения через ConfigurationManager.
EDIT. Чтобы предоставить контекст, библиотека классов обращается к узлу уровня данных (который я не могу изменить), который использует значение в appSettings для получения строки подключения. Единственная проблема заключается в том, что ключ такой же, как строка подключения к веб-приложению (которая может иметь или не иметь другое значение).
Я не хочу, чтобы библиотека классов меняла значение appSetting для этого ключа, а затем веб-приложение начинало обращаться к другой базе данных.
Я полагаю, что отдельный домен приложения может использовать другой файл конфигурации. Я не знаю, как это сделать.
Нет никакого способа сделать это. Это просто не работает .NET.
Учтите, что библиотека классов может использоваться в двух отдельных приложениях. Каждому приложению могут потребоваться разные настройки для одной и той же библиотеки классов. Единственный способ, которым это работает, - это не использовать файл конфигурации из библиотеки классов.
Вместо использования файла 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; }
}
}
Вы можете использовать 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, чтобы вы могли контролировать его доступ и, таким образом, сделать его более проверяемым, но это зависит от дизайна.
Как вы упомянули автоматически сгенерированный код в одном из своих ответов, иногда есть способы обойти это. Скорее всего, этот класс отмечен как частичный, который вы можете инициализировать с помощью правильного объекта "Конфигурация", и поэтому правильная строка соединения
Назовите свой конфигурационный файл, как показано ниже, и поместите его в ту же папку, что и ваша сборка: [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>