首页 > 解决方案 > 用 appsettings.Production.json 中的设置覆盖 appsettings.json 中的数组设置

问题描述

我正在使用 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"
    }
  ]
}

然而,这不起作用——它添加而不是替换。

读到数组是键值存储的语法糖。所以我也试过这个:

"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

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

解决方案


事实上,在构建配置时,那里并没有数组。它只是一个键值对字典。所以你最终得到了字符串键,比如 "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

回到你的问题:数组在 appsettings 中很棘手,虽然受支持,但通常很难使用且不直观。

通过索引,您可能会得到两个不相关对象的奇怪合并,如果您在文件中定义不同的设置集,例如第一个配置中的设置 A 和 B,第二个配置中的设置 C,您将在结果中得到 C 和 B,而且您可能根本不想拥有B。更糟糕的是,如果您只定义每个对象的一些字段,您可能会得到 A 和 C 的混合。

我建议使用其他一些文件来存储此类信息。您还可以在加载配置的位置中断调试器,并亲自查看这些键是如何构建的,以获得更多洞察力。


推荐阅读