是否可以清除 .net 核心配置中的数组?

Is it possible to clear an array in .net core configurations?

现在我正在配置一个系统来监视和处理特定队列。我需要配置每个队列处理程序应与之交互的队列列表,因此我制作了一个 appsettings.json 文件,如下所示:

{
    "AppSettings": {
        "Queues": [
            {
                "Name": "First",
                "Type": "Type1"
            }           ]
    }
}

我在开发时将要处理的队列将不同于机器 X 将要处理的队列,这将不同于机器 Y 将要处理的队列。

现在我正在 Azure 上将该系统部署为 Webjobs,并使用 Azure 本身的应用程序设置面板通过环境变量覆盖应用程序的设置。

但是,这会破坏数组。目前我正在使用 AppSettings:Queues:0:xxxxx 语法覆盖并且工作正常。我什至可以通过更改该语法中的索引,通过环境变量将其他条目添加到列表中。

问题是在开发过程中我向本地 appsettings.json 文件添加了一个额外的队列条目以测试一些新功能。部署后,即使没有设置 AppSettings:Queues:1:xxxxx 环境变量,它仍然使用部署的 appsettings.json 文件中的第二个条目。

有什么方法可以告诉重写我想要一个干净的数组吗?这会造成不确定性,因为我们无法确保开发人员不会添加测试条目,这会导致非测试环境做不正确的事情。这将导致我们无法部署 appsettings.json,这意味着我们无法在所有安装中部署和管理合理的默认设置。

唯一的解决方法是想出一个任意数字(例如 10)并为它们创建空覆盖,但我相信这只是在解决问题。

总结评论:

将设置移动到 appsettings.Development.json。然后您可以存储生产设置

  1. 在appsettings.json
  2. 根本不发布 appsettings.json,而是使用 Azure 网络应用程序中的应用程序设置:

奖励:您可以使用 IOptions feature 而不是使用 AppSettings:Queues:0:xxxxx:为您的设置创建 POCO:

public class Settings
{
    public List<Queue> Queues { get; set; }
}

public class Queue
{
    public string Name { get; set; }
    public string Type { get; set; }
}

将它们注入您的 Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<Settings>(Configuration.GetSection("AppSettings"));
}

并在您的代码中将它们用作列表!