Переопределить настройки массива в appsettings.json с настройками в appsettings.Production.json - PullRequest
0 голосов
/ 11 октября 2018

Я использую ASP.NET Core 2.1.У меня есть настройки в appsettings.json, и я связываю их с классами, используя шаблон параметров.Я хочу переопределить некоторые из них в appsettings.Production.json.

Переопределение поддерживается в соответствии с документами и работает для меня в целом.Но это не работает для массивов.

appsettings.json:

"MySectionOuter": {
  "MySectionInner": [
    {
      "foo": "1",
      "bar": "2",
      "baz": "3"
    },
    {
      "foo": "a",
      "bar": "b",
      "baz": "c"
    }
  ]
}

Мои переопределения в appsettings.Production.json

"MySectionOuter": {
  "MySectionInner": [
    {
      "bar": "4",
    },
    {
      "baz": "d"
    }
  ]
}

Однако это не работает -он добавляет, а не заменяет.

I читает, что массив является синтаксическим сахаром для хранилища значений ключа.Поэтому я также попробовал это:

"MySectionOuter": {
  "MySection:1": {
    "bar": "4",
  },
  "MySection:2": {
    "baz": "b",
  }
}

Но это также не работает.

Какой правильный синтаксис?

ОБНОВЛЕНИЕ

Комментарии показывают, что я не объяснил должным образом.Я хочу вот что:

Во время разработки:

element1: foo=1
element1: bar=2
element1: baz=3
element2: foo=a
element2: bar=b
element2: baz=c

Во время производства:

element1: foo=1
element1: bar=2
element1: baz=4  // this was changed
element2: foo=a
element2: bar=b
element2: baz=d  // this was changed

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

На самом деле, при построении конфигурации там нет массивов.Это просто словарь пары ключ-значение.Таким образом, вы получаете строковые ключи, что-то вроде "mysectionouter:mysectioninner:0:foo" = 1.

Так что, когда в вашей конфигурации вы определяете массив, происходит следующее:

appsettings.json:

"mysectionouter:mysectioninner:0:foo" = 1
"mysectionouter:mysectioninner:0:bar" = 2

appsettings.production.json:

"mysectionouter:mysectioninner:0:bar" = new1

результат:

foo = 1
bar = new1

Так что это просто на основе индекса, а следующая конфигурация просто переопределяет ключ.Во втором примере вы ничего не добьетесь, кроме изменения индекса.Представление будет следующим:

"mysectionouter:mysectioninner:1:bar" = new1

Итак, вернемся к вашему вопросу: массивы сложны в настройках приложений, и хотя они поддерживаются, как правило, сложны и не интуитивно понятны в использовании.

По индексу вы можете получить странное слияние двух не связанных объектов, если вы определите разные наборы настроек в ваших файлах, например, настройки A и B в первой конфигурации и C во второй, вы получите Cи B в результате, и вы, вероятно, не хотите иметь B вообще.Хуже того, вы можете получить сочетание A и C, если определите только некоторые поля каждого объекта.

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

0 голосов
/ 11 октября 2018

Согласно этому сообщению в блоге: https://www.paraesthesia.com/archive/2018/06/20/microsoft-extensions-configuration-deep-dive/

Невозможно удалить элементы конфигурации с поставщиком.

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

Вместо этого вы должны заполнить только минимальную информацию, необходимую в appsettings.config, и заполнить соответствующие настройки в более специализированном файле настроек.Например, appsettings.Development.config или ваш appsettings.Production.config.Или, как предлагается в сообщении в блоге:

Поскольку вы не можете удалить что-либо, укажите как можно меньше конфигурации и ведите себя корректно, используя значения по умолчанию в вашем коде, когда конфигурация отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...