gpt4 book ai didi

c# - ASP.net Core 2.0 中的 appsettings.json 预览配置 GetSection null

转载 作者:可可西里 更新时间:2023-11-01 07:56:51 26 4
gpt4 key购买 nike

我试图从 Startup.cs 中的注入(inject)配置调用 GetSection。值为 null,而 indexer 到具体部分值返回 non-null 值。在我看来,GetSection 方法背后有一个错误,或者我错了?

appsettings.json:

{ "MyConfig": { "ConfigA": "valueA", "ConfigB": "valueB" } }

程序.cs:

    public static void Main(string[] args)
{
var host = BuildWebHost(args);
host.Run();
}

public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();

Startup.cs:

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

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var mySection = this.Configuration.GetSection("MyConfig");

var myVal = this.Configuration["MyConfig:ConfigA"];

最佳答案

我首先检查了 1.1.1 之间是否有任何变化和 2.xJsonConfigurationProvider.cs ,最终从您的 JSON 文件构造可检索值的内部代码。您的 this.Configuration.GetSection("MyConfig"); 最终调用的此代码或任何其他代码没有任何更改。 .

检索值的工作方式是 Configuration会寻找你的 key MyConfig在每个配置提供程序中按照代码中定义的相反顺序,直到找到一个值。在您的示例中,提供程序(json、环境变量、命令行参数)在 Webhost.CreateDefaultBuilder() 中提供。 (see here) .

查看 JsonConfigurationFileParser.cs 的代码,它构建了一个 Dictionary<string, string>对于键和值,但仅适用于原始值。也就是说,没有为 MyConfig 存储 key (在这个级别它是一个对象),但是将有一个 MyConfig:ConfigA 的键, 并且数组值看起来像 MyConfig:ConfigA:0 , MyConfig:ConfigA:1

最后,你会发现Configuration.GetSection("MyConfig") always returns you a newly constructed ConfigurationSection那是永不为空,最坏的情况下会有一个Value 属性(property) null .

那么当您将鼠标悬停在 ConfigurationSection 上时会发生什么?使用 Intellisense 并查看 Value属性是已搜索每个 配置提供程序,但未发现任何一个具有“MyConfig”键,原始值转换为字符串以返回。

您至少需要调用:

services.Configure<MyConfigOptions>(configuration.GetSection("MyConfig"));
services.AddSingleton(cfg => cfg.GetService<IOptions<MyConfigOptions>>().Value);

将其作为 C# 对象注入(inject)到整个应用程序中。否则,用冒号调用单个值 ["MyConfig:ConfigA"]分隔符语法或使用 var mySection = this.Configuration.GetSection("MyConfig")["ConfigA"]; ,这是多余的,但说明它仅用于检索原语。

为了绑定(bind)到 C# 对象并注入(inject)它们,我创建了以下扩展方法:

public static class IServiceCollectionExtensions
{
public static IServiceCollection AddConfigOptions<TOptions>(this IServiceCollection services,
IConfiguration configuration, string section) where TOptions : class, new()
{
services.Configure<TOptions>(configuration.GetSection(section));
services.AddSingleton(cfg => cfg.GetService<IOptions<TOptions>>().Value);
return services;
}
}

可以这样调用:

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

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
services.AddConfigOptions<EmailOptions>(Configuration, "Email")

然后像这样注入(inject):

public class EmailSender : IEmailSender
{
private EmailOptions _emailOptions;

public EmailSender(EmailOptions options) => _emailOptions = options;

关于c# - ASP.net Core 2.0 中的 appsettings.json 预览配置 GetSection null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45030383/

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