使用特定于环境的appsettings.json文件时,是否可以按设置替换和不添加?

时间:2018-08-31 18:25:45

标签: c# .net-core .net-core-configuration

我发现,在使用.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控制台应用程序,我必须添加以下软件包:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Json
  • Microsoft.Extensions.Configuration.Binder

0 个答案:

没有答案