尝试设置配置值“IHostBuilder”,但未反映在 Startup class - asp.net core 3.1 中的 ConfigureServices

trying to set config value `IHostBuilder` but not reflected for ConfigureServices in Startup class - asp.net core 3.1

我有以下配置,连接字符串为空,

"ConnString": {
"Value":  "" 
},

现在在 Asp.Net Core 3.1 应用程序中,我正在尝试在 CreateHostBuilder

中设置连接字符串值
public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureAppConfiguration((context, config) =>
                {
                    var settings = config.Build();
                    settings["ConnString:Value"] = "MY CONNECTION STRING";

                });

                webBuilder.UseStartup<Startup>();
            });

但是这个值没有反映在 Startup class 的 ConfigureServices 方法中,它仍然显示为空。我需要在这里做什么?请建议!

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
    {
        var updateValue = Configuration.GetSection("ConnString:Value").Value;
    }

您正在构建配置并在 new IConfiguration 对象上设置值。然而,这些设置将会丢失,因为您没有在 builder 上设置值。底层基础设施稍后再次调用 Build,创建另一个 new IConfiguration。这些值不会神奇地转移过来。

您可以改为调用 AddInMemoryCollection 并在那里传递您的新设置。这将被基础设施消耗并稍后可用(即在 ConfigureServices 中):

webBuilder.ConfigureAppConfiguration((context, config) =>
{
   config.AddInMemoryCollection(
     new [] { 
       new KeyValuePair<string, string>("ConnString:Value", "MY CONNECTION STRING") 
     }
   );
});

IWebHostBuilder 也有一个 UseSetting 方法,您可以在其中配置 单个 设置。这将添加一个仅包含一个值的新内存中配置提供程序:

webBuilder.UseSetting("ConnString:Value", "MY CONNECTION STRING");

请注意,IWebHostBuilder 将使用来自 IHostBuilder(通用主机)的配置。您也可以在主机构建器上调用 ConfigureAppConfiguration

Host.CreateDefaultBuilder(args) 
    .ConfigureAppConfiguration((context, config) =>
     {
        config.AddInMemoryCollection(
          new [] { 
            new KeyValuePair<string, string>("ConnString:Value", "MY CONNECTION STRING") 
          }
        );
     });

如果您有用于配置 其他 设置的设置,此“注入”特别有用。您可以改为将它们添加到 ConfigureHostConfiguration(对于 IWebHostBuilder 不存在),从而允许它们的值在 ConfigureAppConfiguration 中在任一构建器上可用。

请注意,配置不会返回 共享给主机构建器。您添加到虚拟主机的任何配置都不会自动应用于通用主机。我之所以这样说,是因为它不同于两者共享的 ServiceCollection 的行为(将服务添加到另一个)。

根据您的评论更新

我在上面提到,如果您有用于 configure/setup 其他配置提供程序的设置,则可以使用 ConfigureHostConfiguration。这对于配置 Azure KeyVault 之类的东西特别有用。

Host.CreateDefaultBuilder(args) 
    .ConfigureHostConfiguration(config =>
     {
        // setup bootstrapping settings. For example if we need to add in values used
        // to configure azure key vault stored in app settings and maybe some in memory 
        config.AddJsonFile("appsettings.json");
        config.AddInMemoryCollection(
          new [] { 
            new KeyValuePair<string, string>("ClientId", "AzureClientId"), 
            new KeyValuePair<string, string>("TenantId", "AzureTenantId") 
          }
        );
     })
     // settings added in ConfigureHostConfiguration are now available via context.Configuration
    .ConfigureAppConfiguration((context, config) =>
     {
         // use the values we added during bootstrapping 
         var tenant = context.Configuration["TenantId"];
         var client = context.Configuration["ClientId"];
         // example, I don't remember the parameters off-hand
         config.AddAzureKeyVault(tenant, client, /*etc*/);
     });

在此示例中,也可以在 IWebHostBuilder 上调用 ConfigureAppConfiguration

有关配置和通用主机的更多信息,see the documentation