用appsettings.Production.json中的设置覆盖appsettings.json中的数组设置

时间:2018-10-11 07:56:31

标签: c# asp.net-core asp.net-core-2.0

我正在使用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 read that数组是键值存储的语法糖。所以我也尝试了这个:

"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 :(得分:7)

实际上,构建配置时,那里没有阵列。它只是一个键值对字典。所以你最终得到了字符串键,就像 "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。

我建议使用其他一些文件来存储此类信息。您还可以仅在加载配置的位置插入调试器,并亲自了解如何构建这些键以获得更多见解。

答案 1 :(得分:1)

根据此博客文章:https://www.paraesthesia.com/archive/2018/06/20/microsoft-extensions-configuration-deep-dive/

无法通过提供程序删除配置项。

  

您可以在覆盖时间添加配置,但不能删除任何内容。最好的办法是使用空字符串覆盖一个值。

相反,您应该只在appsettings.config中填写所需的信息,然后在更专门的设置文件中填写适当的设置。例如。 appsettings.Development.config或您的appsettings.Production.config。或按照博客文章中的建议:

  

由于您无法删除内容,因此请尽可能少地配置,并在配置不存在时使用代码中的默认值正确运行。