我发现,在使用.NET Generic Host并使用多个appsettings.json
文件设置控制台应用程序时,后面文件的内容会覆盖(在注册方面)内存中以前文件的内容,但他们不会取代它。
让我解释一下,我将在下面发布重现此代码的代码,但首先是两个json文件:
appsettings.json
,先加载
{
"Folders": [
"main-1",
"main-2"
]
}
appsettings.debug.json
,第二次加载
{
"Folders": [
"debug-1"
]
}
将其加载到选项对象中时,我希望调试设置具有优先级,并且确实如此,但是它只是替换了主配置文件的第一个元素。
让我改一下。我将配置文件加载到此类中:
internal class Options
{
public List<string> Folders { get; } = new List<string>();
}
在同时添加两个文件和最后一个调试文件时,我想要的是上面的list属性仅包含"debug-1"
。
相反,它包含"debug-1", "main-2"
,因此只有第一个元素被覆盖,第二个元素未被覆盖。
虽然对于字典我可以理解这一点,但是只替换了我实际指定的键,对于一个数组(对我来说)似乎有点奇怪。
代码如下:
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
namespace ConsoleApp3
{
class Program
{
static void Main()
{
var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json");
builder.AddJsonFile("appsettings.debug.json");
var configuration = builder.Build();
var options = configuration.Get<Options>();
foreach (var folder in options.Folders)
Console.WriteLine(folder);
}
}
internal class Options
{
public List<string> Folders { get; } = new List<string>();
}
}
该程序的输出为:
debug-1
main-2
我希望它仅包含"debug-1"
。加载配置文件时是否可以指定某些内容,使其表现得像这样?
这是一个.NET Core 2.1控制台应用程序,我必须添加以下软件包: