现在我正在配置一个系统来监视和处理特定队列的内容。我需要配置每个队列处理程序应该与之交互的队列列表,因此我创建了一个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)并为它们创建空值覆盖,但我相信这只会让你无所顾忌。
答案 0 :(得分:2)
总结评论:
将设置移至appsettings.Development.json
。然后,您可以存储生产设置
奖励:您可以使用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"));
}
并在代码中将它们用作列表!