.net 核心选项配置数组覆盖
.net core Options configuration array override
我有一个 class,其中一个 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.
覆盖默认值
谢谢。
此行为是 by design because when binding to collections in options, the values will be appended. The reason why you cannot overwrite the default values from your MyOptions
options model is that options and configuration are actually two distinct concepts which can work together but don’t have to. I go into more detail in an ,但基本上处理配置和将配置绑定到选项对象是两个独立的事情。
当你只看你的配置时,有以下值:
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
或其他一些来源(例如环境变量)覆盖那些并应用您的覆盖。当然,你不应该在你的选项类型中指定默认值。
我有一个 class,其中一个 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.
覆盖默认值谢谢。
此行为是 by design because when binding to collections in options, the values will be appended. The reason why you cannot overwrite the default values from your MyOptions
options model is that options and configuration are actually two distinct concepts which can work together but don’t have to. I go into more detail in an
当你只看你的配置时,有以下值:
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
或其他一些来源(例如环境变量)覆盖那些并应用您的覆盖。当然,你不应该在你的选项类型中指定默认值。