c# - 用 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
解决方案
事实上,在构建配置时,那里并没有数组。它只是一个键值对字典。所以你最终得到了字符串键,比如
"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 的混合。
我建议使用其他一些文件来存储此类信息。您还可以在加载配置的位置中断调试器,并亲自查看这些键是如何构建的,以获得更多洞察力。
推荐阅读
- asp.net-mvc - 将对象的持久集合添加到 .NET Core 中的另一个对象
- ocr - 正方体无法识别简单数字
- php - 需要知道鳕鱼的语言
- c# - 在我的 TableAdapter 中使用 If 语句时发生错误
- ruby-on-rails - 如何在使用 rspec 的方法中分配数据虚拟对象
- mysql - 如何在使用 select 的查询中仅获取具有重复值的列中的最后一个结果?
- android - 为什么 Android 主题不适用于单个按钮
- django - 如何使用 django-import export 添加用于导入数据的文件?
- android - 如何在按钮单击时在自定义视图中绘制一个圆圈
- c - c 中指向 r 值的指针赋值