如何替换自定义 appsettings.json 文件中的列表项?

gab*_*abs 5 c# json appsettings asp.net-core

我为每个环境都有自定义的 appsettings.json 文件,例如 appsettings.Dev.json、appsettings.Test.json、appsettings.Prod.json。在主 appsettings.json 中,我有以下代码:

  "EmailSettings": {
    "Recipients": [
      "person@test.com"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

然后在自定义 json 文件中,我想覆盖此列表,如下所示:

  "EmailSettings": {
    "Recipients": [
      "anotherperson@test.com"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

但相反,它会像这样附加:

  "EmailSettings": {
    "Recipients": [
      "person@test.com",
      "anotherperson@test.com"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

对于所有其他类型的设置,它们都会被替换,但由于某种原因,似乎会附加自定义设置文件中的列表。在 .net 中,您可以使用 xslt 获得更细粒度的信息,以便能够确定是否要替换或附加覆盖的设置。这里有什么建议吗?

解决方案(对我来说)

我这样做了,它在自定义 json 设置中被替换。主要appsettings.json:

  "EmailSettings": {
    "Recipients:0": "person@test.com"
  }
Run Code Online (Sandbox Code Playgroud)

然后在自定义设置文件中:

  "EmailSettings": {
    "Recipients:0": "anotherperson@test.com"
  }
Run Code Online (Sandbox Code Playgroud)

感谢您的回复!

Abh*_*dha 0

appsettings.Test.json使用下面的

"EmailSettings:Recipients:0" : "anotherperson@test.com"

配置 API 能够通过在配置键中使用分隔符来展平分层数据,从而维护分层配置数据。

您需要定义电子邮件设置类,例如

   public class EmailSettings
    {
        public List<string> Recipients { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

并连接 DI 以在类Configure中的方法中添加选项Startup

public void ConfigureServices(IServiceCollection services)
        {
            // add Options
            services.AddOptions();
            services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }
Run Code Online (Sandbox Code Playgroud)