本文介绍了用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中的数组设置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!