Я работаю над библиотекой классов С#, которая должна быть в состоянии читать настройки из файла web.config
или app.config
(в зависимости от того, ссылается ли DLL из веб-приложения ASP.NET или приложения Windows Forms).
Я обнаружил, что
ConfigurationSettings.AppSettings.Get("MySetting")
работает, но этот код был отмечен как устаревший Microsoft.
Я читал, что должен использовать:
ConfigurationManager.AppSettings["MySetting"]
Однако класс System.Configuration.ConfigurationManager
, похоже, не доступен из проекта библиотеки классов С#.
Кто-нибудь знает, что лучший способ сделать это?
Вам нужно добавить ссылку в System.Configuration
в папку ссылок.
Вы должны использовать ConfigurationManager
для устаревшего ConfigurationSettings
.
Для примера App.config, как показано ниже:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="countoffiles" value="7" />
<add key="logfilelocation" value="abc.txt" />
</appSettings>
</configuration>
Вы читаете приведенные выше настройки приложения, используя следующий код:
using System.Configuration;
Вам также может потребоваться добавить ссылку на System.Configuration в вашем проекте, если ее еще нет. Затем вы можете получить доступ к таким значениям:
string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];
Надеюсь, это поможет!
Обновление для фреймворков 4.5 и 4.6; следующее больше не будет работать:
string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"];
Теперь перейдите в класс настроек через Properties:
string keyvalue= Properties.Settings.Default.keyname;
Подробнее см. "Управление настройками приложения" .
Щелкните правой кнопкой мыши на своей библиотеке классов и выберите "Добавить ссылки" в меню; и, наконец, с вкладки .NET выберите System.Configuration. Это будет включать DLL System.Configuration в ваш проект.
ConfigurationManager.ConnectionStrings[0].ConnectionString
Я использую это, и он хорошо работает для меня
textBox1.Text = ConfigurationManager.AppSettings["Name"];
Вы должны добавить в проект ссылку на сборку System.Configuration.
Возможно, вы добавляете файл App.config в DLL. App.Config работает только для исполняемых проектов, так как все DLL принимают конфигурацию из файла конфигурации для исполняемого exe.
Скажем, у вас есть два проекта в вашем решении:
Возможно, проблема связана с тем, что вы включили app.config в SomeDLL, а не в SomeExe. SomeDll может прочитать конфигурацию из проекта SomeExe.
Чтение из конфигурации:
Вам нужно добавить ссылку на Config
Получить значение с помощью следующего кода:
string value = Properties.Settings.Default.keyname;
Сохранить в настройках:
Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();
Попробуйте следующее:
string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"];
В web.config должна быть следующая структура:
<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
У меня была та же проблема, просто прочитайте их следующим образом:
System.Configuration.ConfigurationSettings.AppSettings["MySetting"]
This method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Я настоятельно рекомендую вам создать Wrapper для этого вызова. Что-то вроде ConfigurationReaderService
и используйте инъекцию зависимости, чтобы получить этот класс. Таким образом вы сможете изолировать эти файлы конфигурации для целей тестирования.
Поэтому используйте предложенный ConfigurationManager.AppSettings["something"];
и верните это значение. Вы можете с помощью этого метода создать какой-то возврат по умолчанию, если в файле .config нет ключа.
app.DEBUG.config
, app.RELEASE.config
и app.TEST.config
, так далее.
Как я нашел лучший подход для доступа к переменным параметрам приложения системным образом, создав класс-оболочку над System.Configuration, как показано ниже
public class BaseConfiguration
{
protected static object GetAppSetting(Type expectedType, string key)
{
string value = ConfigurationManager.AppSettings.Get(key);
try
{
if (expectedType == typeof(int))
return int.Parse(value);
if (expectedType == typeof(string))
return value;
throw new Exception("Type not supported.");
}
catch (Exception ex)
{
throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
key, expectedType), ex);
}
}
}
Теперь мы можем получить доступ к необходимым параметрам настроек с помощью жестко закодированных имен, используя другой класс, как показано ниже
public class ConfigurationSettings:BaseConfiguration
{
#region App setting
public static string ApplicationName
{
get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
}
public static string MailBccAddress
{
get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
}
public static string DefaultConnection
{
get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
}
#endregion App setting
#region global setting
#endregion global setting
}
Кроме того, вы можете использовать formo:
Конфигурация:
<appSettings>
<add key="RetryAttempts" value="5" />
<add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>
код:
dynamic config = new Configuration();
var retryAttempts1 = config.RetryAttempts; // returns 5 as a string
var retryAttempts2 = config.RetryAttempts(10); // returns 5 if found in config, else 10
var retryAttempts3 = config.RetryAttempts(userInput, 10); // returns 5 if it exists in config, else userInput if not null, else 10
var appBuildDate = config.ApplicationBuildDate<DateTime>();
web.config
используется с веб-приложениями. web.config
будет по умолчанию иметь несколько конфигураций, необходимых для веб-приложения. Вы можете иметь web.config
для каждой папки в вашем веб-приложении.
app.config
используется для приложений Windows. Когда вы создаете приложение в vs .net, оно будет автоматически переименовано в <appname>.exe.config
, и этот файл должен быть доставлен вместе с вашим приложением.
Вы можете использовать тот же метод для вызова значений app settings
из обоих файлов конфигурации:
System.Configuration.COnfigurationSettings.AppSettings["Key"]
System.Configuration.COnfigurationSettings.AppSettings.Get("Key")
вместо использования квадратных скобок.
Другое возможное решение:
var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
Просто для полноты, есть еще один вариант, доступный только для веб-проектов:
System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"]
Преимущество этого заключается в том, что он не требует добавления дополнительной ссылки, поэтому для некоторых людей это может быть предпочтительнее.
Я всегда создаю интерфейс IConfig со свойствами typeafe, объявленными для всех значений конфигурации. Затем класс реализации Config завершает вызовы System.Configuration. Все ваши вызовы System.Configuration теперь в одном месте намного проще и чище, чтобы поддерживать и отслеживать, какие поля используются, и объявлять их значения по умолчанию. Я пишу набор частных вспомогательных методов для чтения и анализа общих типов данных.
Используя структуру IoC, вы можете получить доступ к полям IConfig в любом месте вашего приложения, просто передав интерфейс конструктору класса. Затем вы можете создавать макетные реализации интерфейса IConfig в своих модульных тестах, чтобы теперь вы могли тестировать различные значения конфигурации и комбинации значений без необходимости касаться файлов App.config или Web.config.
Я пытаюсь найти исправление для этой же проблемы в течение пары дней. Я смог разрешить это, добавив ключ в тег appsettings в файле web.config. Это должно переопределить .dll при использовании помощника.
<configuration>
<appSettings>
<add key="loginUrl" value="~/RedirectValue.cshtml" />
<add key="autoFormsAuthentication" value="false"/>
</appSettings>
</configuration>
для ex:
<applicationSettings>
<MyApp.My.MySettings>
<setting name="Printer" serializeAs="String">
<value>1234 </value>
</setting>
</MyApp.My.MySettings>
</applicationSettings>
Dim strPrinterName as string= My.settings.Printer