Как определить пару ключ / значение с внешним файлом .config - PullRequest
0 голосов
/ 28 апреля 2020

Я указываю <appSettings> в моем файле app.config, я добавляю

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings configSource="ShareAppSettings.debug.config"/>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/>
    </startup>
</configuration>

ShareAppSettigns.debug.config - это мой внешний файл конфигурации, который я использую на своей локальной машине, и я делаю это не хочу делиться этим с остальной частью моей команды.

ShareAppSettings.debug.config выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
  <add key="clientID" value="11" />
  <add key="clientSecret" value="11" />
  <add key="tenantID" value="11" />
</appSettings>

Всякий раз, когда я пытаюсь отладить основной код:

private static List<string> AppCredentials()
{
   string clientID = ConfigurationManager.AppSettings["clientID"];
   string clientSecret = ConfigurationManager.AppSettings["clientSecret"];
   string tenantID = ConfigurationManager.AppSettings["tenantID"];

   List<string> appCred = new List<string> { clientID, clientSecret, tenantID };

   if (clientID == null)
       throw new Exception("ShareAppSettings.Debug.Config file was not provided in this repo.");

   return (appCred);
}

По какой-то причине я не получаю значения для clientId, slientSecret или tenantId. Этот код является частью дополнения кузнечика для шаблона v6 и работает на нем. NET Framework 4.7.1. Всякий раз, когда я копирую тот же код в новую консоль C# того же фреймворка, код создается. Я был бы очень признателен, если бы вы могли дать мне предложения, как решить эту проблему.

Что означает «EnableWindowsFormsHighDpiAutoResizing» и как это сделать?

Большое спасибо

введите описание изображения здесь

1 Ответ

0 голосов
/ 28 апреля 2020

Я предлагаю использовать атрибут file (соответствующий свойству AppSettingsSection.File ) вместо атрибута configSource (соответствующего свойство SectionInformation.ConfigSource ) в разделе appSettings.

  • configSource не поддерживает другие ключи в разделе, в то время как appSettings может содержать другие ключи, необходимые для Приложения и, возможно, где-то еще (кто-то может добавить / удалить их - для тестирования цели или любая другая причина).

Атрибут file позволяет вместо этого присутствовать другой ключ в разделе appSettings.

Ваш файл app.config может быть:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <appSettings file="ShareAppSettings.debug.config">
        <add key="DpiAwareness" value="PerMonitorV2"/>
    </appSettings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/>
    </startup>
</configuration>

Теперь значения доступны при открытии именованного раздела конфигурации:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");

var kvpClientID = appSettings.Settings["clientID"];
var kvpClientSecret = appSettings.Settings["clientSecret"];
var kvpCenantID = appSettings.Settings["tenantID"];

string clientID = kvpClientID.Value;

и напрямую, используя ConfigurationManager.AppSettings - NameValueCollection - что возвращает значение указанного ключа:

string clientID = ConfigurationManager.AppSettings["clientID"];
string clientSecret = ConfigurationManager.AppSettings["clientSecret"];
string tenantID = ConfigurationManager.AppSettings["tenantID"];

В качестве примечания, используя атрибут file, ваш ShareAppSettings.debug.config не нуждается (но не запрещен) в заголовке XML, он может быть просто:

<appSettings>
  <add key="clientID" value="11" />
  <add key="clientSecret" value="11" />
  <add key="tenantID" value="11" />
</appSettings>

Вторичное примечание:
Вы можете установить атрибут file, чтобы он указывал на другой файл во время выполнения, и обновить sh значения appSettings для обновления конфигурации.
Обратите внимание, что если атрибут file уже был установлен, все значения, содержащиеся в этом файле .config, не отклоняются , а вместо этого перемещаются в файл [Application].exe.config, чтобы стать частью <appSettings> раздел (таким образом, они сохраняются).
Еще одна причина, почему используется атрибут file Ют может быть предпочтительнее.

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var appSettings = config.AppSettings;
appSettings.File = "SomeOtherFile.config";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
...