Чтение настроек из приложения.config или web.config in.net
Я работаю над библиотекой классов C#, которая должна иметь возможность читать настройки из web.config или app.config файл (в зависимости от того, ссылается ли DLL из ASP.NET веб-приложение или приложение Windows Forms).
я нашел это
ConfigurationSettings.AppSettings.Get("MySetting")
работает, но этот код был помечен как устаревший Microsoft.
Я читал, что я должен использовать:
ConfigurationManager.AppSettings["MySetting"]
однако System.Configuration.ConfigurationManager класс, похоже, не доступен из a Проект библиотеки классов C#.
кто-нибудь знает, что лучший способ сделать это?
20 ответов:
вам потребуется добавить ссылку до
System.Configurationв вашем проекте папку ссылки.вы определенно должны использовать
ConfigurationManagerнад устаревшимConfigurationSettings.
Для Примера Приложения.конфигурация, как показано ниже:
<?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;вам также может потребоваться добавить ссылку на систему.Конфигурация в вашем проекте, если ее еще нет. Затем вы можете получить доступ к значениям следующим образом:
string configvalue1 = ConfigurationManager.AppSettings["countoffiles"]; string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];надеюсь, что это помогает!
обновление для Framework 4.5 и 4.6; следующее не будет работать:
string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"];теперь доступ к классу настройки через свойства:
string keyvalue= Properties.Settings.Default.keyname;
посмотреть Управление Настройки Приложения для получения дополнительной информации.
щелкните правой кнопкой мыши на библиотеке классов и выберите в меню опцию "Добавить ссылки"; и, наконец, на вкладке .NET выберите System.Конфигурация. Это будет включать в себя систему.Конфигурация dll в вашем проекте.
Я использую это, и это хорошо работает для меня
textBox1.Text = ConfigurationManager.AppSettings["Name"];
возможно, вы добавляете приложение.конфигурационный файл в DLL. Приложение.Config работает только для исполняемых проектов, так как все dll принимают конфигурацию из файла конфигурации для выполняемого exe.
допустим, у вас есть два проекта в вашем решении:
- SomeDll
- некоторые из них
ваша проблема может быть связана с тем, что вы включаете приложение.config для SomeDLL и не SomeExe. SomeDll умеет читать конфигурация из проекта SomeExe.
Читать Из Конфига :
вам нужно будет добавить ссылку на Config
- откройте "Свойства" в вашем проекте
- перейдите на вкладку "Параметры"
- добавить "имя" и "значение"
получить значение с помощью следующего кода :
строковое значение = "свойства".Настройки.По умолчанию.имя_параметра;
сохранить в Config:
Properties.Settings.Default.keyName = value; Properties.Settings.Default.Save();
У меня была такая же проблема, просто прочитайте их так:
System.Configuration.ConfigurationSettings.AppSettings["MySetting"]
попробуйте это:
string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"];в интернете.конфиг должен быть следующей структуры:
<configuration> <appSettings> <add key="keyname" value="keyvalue" /> </appSettings> </configuration>
web.configиспользуется с веб-приложениями.web.configпо умолчанию имеет несколько конфигураций, необходимых для веб-приложения. Вы можете иметьweb.configдля каждой папки в вашем веб-приложении.
app.configиспользуется для приложений Windows. При сборке приложения в vs.net, он будет автоматически переименован в<appname>.exe.configи этот файл должен быть доставлен вместе с вашим приложением.вы можете использовать тот же метод, чтобы вызвать
app settingsзначения из конфига файлы :System.Configuration.ConfigurationSettings.AppSettings["Key"]
я настоятельно рекомендую вам создать оболочку для этого вызова. Что-то вроде
ConfigurationReaderServiceи использовать инъекцию зависимостей, чтобы получить этот класс. Таким образом, Вы сможете изолировать эти файлы конфигурации для целей тестирования.чтобы использовать
ConfigurationManager.AppSettings["something"];предложено и возвращает это значение. Вы можете с помощью этого метода создать какой-то возврат по умолчанию, если нет ключа, доступного В.конфигурационный файл.
Как я нашел лучший подход для доступа к переменным настроек приложения систематическим образом, сделав класс-оболочку над системой.Конфигурация, как показано ниже
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:
Config:
<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>();
Я пытался найти исправление для этой же проблемы в течение нескольких дней. Я смог решить эту проблему, добавив ключ в теге appsettings в интернете.конфиг. Это должно переопределить .dll при использовании помощника.
<configuration> <appSettings> <add key="loginUrl" value="~/RedirectValue.cshtml" /> <add key="autoFormsAuthentication" value="false"/> </appSettings> </configuration>
Я всегда создаю интерфейс IConfig с типобезопасными свойствами, объявленными для всех значений конфигурации. Затем класс реализации конфигурации обертывает вызовы системы.Конфигурация. Вся ваша система.Вызовы конфигурации теперь находятся в одном месте, поэтому намного проще и чище поддерживать и отслеживать, какие поля используются, и объявлять их значения по умолчанию. Я пишу набор частных вспомогательных методов для чтения и анализа общих типов данных.
используя структуру IoC вы можете получить доступ к IConfig поля в любом месте вашего приложения, просто передав интерфейс конструктору класса. Затем вы также можете создавать макетные реализации интерфейса IConfig в своих модульных тестах, чтобы теперь вы могли тестировать различные значения конфигурации и комбинации значений без необходимости касаться вашего приложения.config или Web.конфигурационный файл.
просто для полноты, есть еще один вариант, доступный только для веб-проектов:
System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"]преимущество этого заключается в том, что он не требует дополнительной ссылки для добавления, поэтому может быть предпочтительным для некоторых людей.
другое возможное решение:
var MyReader = new System.Configuration.AppSettingsReader(); string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
пожалуйста, проверьте версию .net вы работаете. Она должна быть выше 4. И вы должны добавить систему.Конфигурация системной библиотеки для вашего приложения
например:
<applicationSettings> <MyApp.My.MySettings> <setting name="Printer" serializeAs="String"> <value>1234 </value> </setting> </MyApp.My.MySettings> </applicationSettings> Dim strPrinterName as string= My.settings.Printer
Comments