首页 > 解决方案 > 如何在 ASP .NET Core 中初始化主机之前读取配置设置?

问题描述

在初始化应用程序主机之前,我需要从应用程序的配置中读取一些设置来设置其他一些东西。

在 ASP .NET Core 2.x 中,在初始化应用程序主机之前读取设置我曾经执行以下操作:

public static void Main(string[] args)
{
    //...

    var configuration = new ConfigurationBuilder()
        .AddEnvironmentVariables()
        .AddCommandLine(args)
        .AddJsonFile("appsettings.json")
        .Build();

    //Do something useful with the configuration...

    var host = WebHost.CreateDefaultBuilder()
        .UseStartup<Startup>()
        .UseConfiguration(configuration)
        .Build();

    //...
}

在 ASP 中,.NET Core 3.xWebHost 已被弃用,取而代之的是 .NET Generic Host
.NET 通用主机只有.ConfigureHostConfiguration()并且.ConfigureAppConfiguration()不将构建配置作为参数,而是仅接受用于设置配置的委托。

对于 HTTP 工作负载,您仍然可以使用.UseConfiguration()它公开的方法,IWebHostBuilder并且与以前基本相同:

public static void Main(string[] args)
{
    //...

    var configuration = new ConfigurationBuilder()
        .AddEnvironmentVariables()
        .AddCommandLine(args)
        .AddJsonFile("appsettings.json")
        .Build();

    //Do something useful with the configuration...

    var host = Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>()
                .UseConfiguration(configuration);
        })
        .Build();

    //...
}

但这仅适用于 HTTP 工作负载,不适用于Worker 服务。

为了在设置主机之前获取配置,我想出了以下方法:

public static void Main(string[] args)
{
    //...

    var configuration = ConfigureConfigurationBuilder(args)
        .Build();

    //Do something useful with the configuration...

    var host = Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder => ConfigureConfigurationBuilder(args, builder))
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .Build();

    //...
}

public static IConfigurationBuilder ConfigureConfigurationBuilder(string[] args, IConfigurationBuilder configurationBuilder = null)
{
    configurationBuilder ??= new ConfigurationBuilder();

    configurationBuilder
        .AddEnvironmentVariables()
        .AddCommandLine(args)
        .AddJsonFile("appsettings.json");

    return configurationBuilder;
}

本质上,我编写了一个设置 aConfigurationBuilder并返回它的方法,以便我可以重用相同的配置。这在实践中有效,但我两次构建相同的配置。

在设置 Host 之前,是否有更简单/更正确的方法(适用于 HTTP 工作负载和非 HTTP 工作负载)来构建和重用配置?

标签: c#asp.net-coreasp.net-core-3.0

解决方案


您可以清除添加的默认源,然后添加带有扩展方法CreateDefaultBuilder的预构建。IConfigurationAddConfiguration

public static void Main(string[] args)
{
    //...

    var configuration = new ConfigurationBuilder()
        .AddEnvironmentVariables()
        .AddCommandLine(args)
        .AddJsonFile("appsettings.json")
        .Build();

    //Do something useful with the configuration...

    var host = Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder =>
        {
            builder.Sources.Clear();
            builder.AddConfiguration(configuration);
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .Build();

    //...
}

推荐阅读