我正在使用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
答案 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
。或按照博客文章中的建议:
由于您无法删除内容,因此请尽可能少地配置,并在配置不存在时使用代码中的默认值正确运行。