ASP .NET Core でホストを初期化する前に構成設定を読み取るにはどうすればよいでしょうか? 質問する

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.xの場合WebHost .NET Generic Host に代えて廃止されました。.NET
Generic Host には、ビルドされた構成をパラメーターとして受け取らず、代わりに構成のセットアップに使用されるデリゲートのみを受け入れる と.ConfigureHostConfiguration()のみがあります。.ConfigureAppConfiguration()

.UseConfiguration()HTTP ワークロードの場合は、公開されているメソッドを引き続き使用して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ワークロードにのみ有効であり、労働者サービス。

ホストをセットアップする前に構成を取得するために、次のアプローチを思いつきました。

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;
}

基本的に、 を設定してそれを返すメソッドを記述してConfigurationBuilder、同じ構成を再利用できるようにしました。これは実際には機能しますが、同じ構成を 2 回構築します。

もっと簡単/正しい方法はありますか(HTTP ワークロードと非 HTTP ワークロードの両方で機能します)ホストをセットアップする前に構成を構築して再利用しますか?

ベストアンサー1

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();

    //...
}

おすすめ記事