.net 如何从IHostBuiler访问IConfiguration

1u4esq0p  于 2023-08-08  发布在  .NET
关注(0)|答案(2)|浏览(105)

I Have a Extension method for IHostBuilder

public static class HostBuilderConfiguration
{
    private static LoggingConfigurationOption _options;
    public static IHostBuilder CustomConfigure(this IHostBuilder builder)
    {
        builder.ConfigureServices((hostContext, services) =>
        {
            
          _options=hostContext.Configuration.GetSection("LoggingConfigurationOption")
                .Get<LoggingConfigurationOption>();
            
        });
        // here _option is null
        return builder;

    }
}

字符串
在注解部分,我需要_option,但它是空的

edqdpe6u

edqdpe6u1#

如果使用Host.CreateDefaultBuilder构建IHostBuilder,可能会出现问题。我们可以从这个discussion中找到想法。
一般的想法是远离回调(在CreateDefaultBuilder中),转向线性代码来配置一切,这是.NET 6的一部分。7.
因此,可能会发生您试图访问的_option行(//here _option为null)之前被执行,然后调用ConfigureServices内部的回调(action)(将调用host.build())。So _option为null。

eit6fx6z

eit6fx6z2#

您的ConfigureServices委托稍后运行,而不是立即运行,这会使_options为null。要解决这个问题,请将LoggingConfigurationOption设置为ConfigureServices中的Singleton服务,允许根据需要将其注入到应用程序中,而不是将其存储为静态变量。

public static class HostBuilderConfiguration
{
    public static IHostBuilder CustomConfigure(this IHostBuilder builder)
    {
        builder.ConfigureServices((hostContext, services) =>
        {
            var options = hostContext.Configuration.GetSection("LoggingConfigurationOption")
                .Get<LoggingConfigurationOption>();

            // Add options as a Singleton service
            services.AddSingleton(options);
        });

        return builder;
    }
}

字符串
或者你可以做下面的事情。

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        // You can access the configuration here.
        var config = host.Services.GetRequiredService<IConfiguration>();
        string mySetting = config.GetValue<LoggingConfigurationOption>("LoggingConfigurationOption");

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

相关问题