如何使用应用程序设置删除 appsettings.json 中的节点.开发.json?



我对appsettings.Development.json如何覆盖或以其他方式与appsettings.json合并有点挣扎。我不确定如何使用应用程序设置从appsettings.json中"清除"节点。开发.json 文件。

作为参考,我使用的是默认构建器,如下所示 https://github.com/aspnet/MetaPackages/blob/rel/2.0.0-preview1/src/Microsoft.AspNetCore/WebHost.cs#L159-L160

appsettings.json

{
"Policy": {
"roles": [
{
"name": "inventoryAdmin",
"subjects": [ "bob", "alice" ],
"identityRoles": [ "ActiveDirectory-Role-Manager" ]
},
]
}
}

鉴于该示例,为什么我不能在我的示例中执行以下操作:

应用设置。开发.Json:

{ "Policy": { "Roles": [] } }

{ "Policy": { "Roles": null } }

当我通过类似Configuration.Get<PolicyServer.Local.Policy>().Roles的东西检查输出时,我仍然会返回 3 个角色。

这个问题有望指导我如何覆盖节点而不仅仅是清除它。所以我希望从简单开始,然后按照我的方式工作。

进入IConfiguration实例的所有设置都只是键值对。采用以下简化示例 JSON:

{
"Roles": [
{ "Name": "Role1", "Subjects": [ "Alice", "Bob" ] },
{ "Name": "Role2", "Subjects": [ "Charlie" ] }
]
}

尽管这本质上是一个树结构,但在添加到IConfiguration实例时,它会映射到以下键值对(此处还有一些额外的空值,但它们不是本讨论的一部分(:

  • Roles=
  • Roles:0:Name=Role1
  • Roles:0:Subjects:0=Alice
  • Roles:0:Subjects:1=Bob
  • Roles:1:Name=Role2
  • Roles:1:Subjects:0=Charlie

您可以看到,这模仿了 JSON 的层次结构,其中名称是对象属性,数字是数组的索引。第一个很重要:Roles有一个键没有值,因为值只能是简单的字符串,它本身只是一个父字符串。

现在,当您向IConfiguration实例设置添加额外的 JSON 文件时,它会映射到一组新的键值对,这些键值对将应用于现有的键值对之上。采用以下附加 JSON:

{
"Roles": []
}

这只会覆盖现有的Roles键,并将其设置为与它已有的相同值:。如果您在 JSON 文件中使用null,这同样适用 - 这就是这些东西的工作方式。

就这里的解决方案而言,我建议您看看是否可以重新设计您的appsettings.json方法。例如,您可以将角色配置本身放入例如appsettings.Production.json文件中,并将默认版本留空,以便它在您的开发环境中不存在。换句话说,尝试将不同的appsettings.json文件建模为累加文件本身。

相关内容

最新更新