每次我调用Configuration.GetSection时,返回对象的Value属性始终为null。

我的Startup构造函数

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddEnvironmentVariables();

    this.Configuration = builder.Build();
}

我的ConfigureServices方法
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<SqliteSettings>(opts => Configuration.GetSection("SqliteSettings").Bind(opts));

    services.AddOptions();

    services.AddMvc();
}

我的appsettings.json
{
  "SqliteSettings": {
    "DataSource": "C:\\db.sqlite",
    "NewDatabase": true,
    "Version": 3
  }
}

我用来定义SqliteSettings的类
public class SqliteSettings
{
    public string DataSource { get; set; }

    public bool? NewDatabase { get; set; }

    public int? Version { get; set; }

    public string Password { get; set; }

    public long? CacheSize { get; set; }

    // More properties
}

我当时在想JSON可能需要具有相同数量的属性才能匹配,或者它可能与数据类型定义有关,但是也许它们是完全不相关的。

最佳答案

根据Microsoft Docs的说法:“当GetSection返回匹配的节时,不会填充Value。当该节存在时,将返回Key和Path。”

如果要查看该部分的值,则需要调用GetChildren()方法:Configuration.GetSection("SqliteSettings").GetChildren();
或者您可以使用:Configuration.GetSection("SqliteSettings").Get<SqliteSettings>()。 JSON不需要具有相同数量的属性即可匹配。不匹配的可为空的属性将被设置为null,不可为空的不可被匹配的属性将被设置为其默认值(例如,int将被设置为0)。

08-25 16:19