Общие настройки в .NET Core? - PullRequest
0 голосов
/ 27 мая 2019

У меня есть 3 файла с именем appsettings.[int/stg/prod].json в моем основном приложении asp.net:

{
    "EmailForFailedNonCrucial":
    {
        "Email": "royin...",
        "Subject": "...",
        "Body": "...",
        "ConnectionString": "Staging-Connection-String"
    },
    "Servers": [
    {
        "Name": "aaa",
        "Services": [
            ...
        ]
    },
    {
        "Name": "bbb",
        "Services": [
            ...
        ]
    }]
}

Каждый раздел имеет соответствующий раздел в классе C #. (для IOptions).

У меня есть 3 версии этого файла для каждого environemnt:

enter image description here

Я могу использовать его через:

 public static IConfigurationRoot ConfigureConfiguration()
        {
            return new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($@"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
                .AddEnvironmentVariables()
                .Build();

        }

Но only , который должен отличаться в разных средах - это ConnectionString.
Секция Servers одинакова для всех сред.

Вопрос:

Кажется странным дублировать Servers во всех 3 файлах.
Как я могу выполнить ( наследование? ), указав его один раз, и иметь только EmailForFailedNonCrucial для среды?

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Простое размещение раздела servers в вашем корневом appsettings.json удалении их из ваших остальных должно добавить конфигурацию servers ко всем остальным по умолчанию.

Еще чтение: Конфигурация в Core

0 голосов
/ 27 мая 2019

Настройки конфигурации в .NET Core обрабатываются как значения в словаре ключ / значение.Значения от нескольких поставщиков объединяются вместе, а более новые значения заменяют более старые.Имена файлов не имеют особого значения, важен только порядок вызовов.

Это объясняется в Essential .NET - Конфигурация в .NET Core и Конфигурация в ASP.NET Core .Несмотря на название, библиотека конфигурации доступна и для приложений Full Framework.

Настройки преобразуются в пары ключ / значение при загрузке.Содержимое этого файла:

{
  "section0": {
    "key0": "value",
    "key1": "value"
  },
  "section1": {
    "key0": "value",
    "key1": "value"
  }
}

сведены в 4 пары, ключи которых:

- section0:key0
- section0:key1
- section1:key0
- section1:key1

Другой файл или поставщик может переопределить предыдущую настройку, если он выдаст тот же ключ.SomeotherFile.json может заменить section1:key0, указав новое значение только для этого ключа:

{
  "section1": {
    "key0": "value",
  }
}

Нет необходимости дублировать настройки.

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

var envSpecificFile=...
return new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile(envSpecificFile, optional: true)
            .AddEnvironmentVariables()
            .Build();

Использование appsettings.prod.json - это просто соглашение.Чтение определенной переменной среды для определения среды также является соглашением.

Общее соглашение для проектов ASP.NET Core заключается в использовании переменной среды ASPNETCORE_ENVIRONMENT:

var env=Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var envSpecificFile = $"appsettings.{env}.json";

Среда также может легко прийти из аргумента командной строки.Это позволило бы тестировать различные конфигурации на сервере QA, например:

string env;
if(args.Length>0)
{
    env=args[0];
}
else
{
    env=Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
}

Параметры не обязательно должны быть получены из файла JSON, они могут легко поступить из словаря, базы данных или централизованной службы конфигурации,

Например:

  var dictSettings = new Dictionary<string, string>()
  {
      ["section0:key1"] = args[1],
  };

Может использоваться для переопределения значения section0:key1:

return new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env}.json", optional: true)
            .AddInMemoryCollection(dictSettings)
            .AddEnvironmentVariables()
            .Build();

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

.AddInMemoryCollection(defaultSettings)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env}.json", optional: true)
.AddEnvironmentVariables()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...