asp.net-core - .net core 选项配置数组覆盖
问题描述
我有一个类,其中一个List<string>
变量具有默认值。
public class MyOptions{
public List<string> Settings {get; set;} = new List<string>(){"Controls","Menus"};
}
然后我用ConfigureServices
类似的方法注册它
services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));
我希望能够在Settings
不更改代码的情况下更改集合的值。在我的 appsettings.json 中,我尝试了以下
{
"MyOptions":{
"Settings:0":"ReplacedSettings"
}
}
替换"Controls"
为"ReplacedSettings"
,但它不起作用,我现在得到Settings
三个值,["Controls","Menus","ReplacedSettings"]
而我想要["ReplacedSettings","Menus"]
.
这支持吗?或者是否有任何类似的数据结构可以使用 Option 模式允许从 appsettings.json 覆盖默认值。
谢谢。
解决方案
此行为是设计使然,因为当绑定到选项中的集合时,将附加这些值。您不能从MyOptions
选项模型中覆盖默认值的原因是选项和配置实际上是两个不同的概念,它们可以一起工作,但不是必须的。我在对相关问题的回答中进行了更详细的介绍,但基本上处理配置和将配置绑定到选项对象是两件不同的事情。
当您只查看您的配置时,就会有以下值:
MyOptions:Settings:0 => "ReplacedSettings"
配置系统不知道你的"Controls"
值"Menus"
。这些仅存在于您稍后绑定到的选项类型中。因此,由于配置中没有其他内容,因此您可以在此处替换任何内容。然后当绑定器使用配置来设置选项类型时,它只会将该单个值附加"ReplacedSettings"
到列表中。
如果要确保可以替换值,则必须在配置中声明这些设置:
MyOptions:Settings:0 => "Controls"
MyOptions:Settings:1 => "Menus"
如果您现在使用您的 应用配置"ReplacedSettings"
,那么它将正确替换一个匹配的键并保留另一个:
MyOptions:Settings:0 => "ReplacedSettings"
MyOptions:Settings:1 => "Menus"
常见的解决方案是使用appsettings.json
默认值。这样,您可以使用特定环境appsettings.<env>.json
或其他一些源(例如环境变量)覆盖那些并应用您的覆盖。当然,你不应该在你的选项类型中指定默认值。
推荐阅读
- c# - 仅从表中选择几列以使用 C# Web API 上的 Odata Select 查询进行映射
- javascript - 如何在 JSON 文件中获取不同的 JSON 对象
- express - 如何在 Vue3 Composition API 中使用 vue-axios?
- php - 我需要在这个 mysqli_fetch_array 中插入什么 PHP 以确保不使用 NULL url?
- javascript - 使用 typescript 遍历 json 响应和一些总账单
- iis - 如何将 ngrok 用于 localhost 的子文件夹
- c++ - 尝试在 MS Visual Studio 代码中安装 boost 1_70 C++ 但得到“不存在此类文件”
- c - 从链表中删除元素时出现异常
- mongoose - 用 Schema 填充数组 mongoose 中的嵌套对象
- java - onMapLongClick() 不创建自定义标记