首页 > 解决方案 > .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 覆盖默认值。

谢谢。

标签: asp.net-coreconfiguration.net-5appsettings

解决方案


此行为是设计使然,因为当绑定到选项中的集合时,将附加这些值。您不能从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或其他一些源(例如环境变量)覆盖那些并应用您的覆盖。当然,你不应该在你的选项类型中指定默认值。


推荐阅读