本文介绍了用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"
    }
  ]
}

但是,这不起作用-它是添加而不是替换。

iread 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

推荐答案

实际上,在构建配置时没有阵列。它只是一个键-值对词典。所以你最终得到的是字符串键,类似于"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

所以它只是基于索引,而Next配置只是覆盖键。在您的第二个示例中,您除了更改索引之外什么也没有实现。表示形式为:

"mysectionouter:mysectioninner:1:bar" = new1
回到您的问题:数组在应用程序设置中很复杂,虽然受支持,但通常很难使用,而且不直观。

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

我建议使用其他一些文件来存储此类信息。您还可以进入调试器中加载配置的位置,亲自查看这些键是如何构建的,以获得更深入的了解。

这篇关于用appsettings.Production.json中的数组设置覆盖appsettings.json中的数组设置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 23:55