gpt4 book ai didi

c# - 尝试设置配置值 `IHostBuilder` 但未反射(reflect)在启动类中的 ConfigureServices - asp.net core 3.1

转载 作者:行者123 更新时间:2023-12-05 02:52:24 24 4
gpt4 key购买 nike

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

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

但是这个值没有反射(reflect)在 Startup 类的 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;
}

最佳答案

您正在构建配置并在 IConfiguration 上设置值目的。然而,这些设置将会丢失,因为您没有在构建器 上设置值。底层基础设施稍后再次调用Build,创建另一个 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")
}
);
});

如果您有用于配置其他 设置的设置,这种“注入(inject)”特别有用。您可以将它们添加到 ConfigureHostConfiguration 中(对于 IWebHostBuilder 不存在)允许它们的值在 within ConfigureAppConfiguration 中可用在任一生成器上。

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

根据您的评论更新:

我在上面提到了 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*/);
});

在这个例子中 ConfigureAppConfiguration也可以在 IWebHostBuilder 上调用相反。

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

关于c# - 尝试设置配置值 `IHostBuilder` 但未反射(reflect)在启动类中的 ConfigureServices - asp.net core 3.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62636075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com