每次我调用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)。