作者:C_z和 | 来源:互联网 | 2022-12-02 15:29
我正在使用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",
}
}
但这也行不通.
什么是正确的语法?
UPDATE
评论显示我没有正确解释.我想要的是这样的:
在开发期间:
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
Maxim Zabolo..
10
实际上,构建配置时没有阵列.它只是一个键值对字典.所以你最终得到了字符串键,类似于
"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.
我建议使用其他一些文件来存储这类信息.您还可以在配置加载的位置打破调试器,并亲自查看这些键是如何构建的,以获得更多洞察力.
1> Maxim Zabolo..:
实际上,构建配置时没有阵列.它只是一个键值对字典.所以你最终得到了字符串键,类似于
"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.
我建议使用其他一些文件来存储这类信息.您还可以在配置加载的位置打破调试器,并亲自查看这些键是如何构建的,以获得更多洞察力.