每次调用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可能需要具有相同数量的属性才能匹配,或者它可能与数据类型定义有关,但可能与这些属性完全无关。
答案 0 :(得分:10)
只需修改您的ConfigureServices
方法即可:
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<SqliteSettings>(Configuration.GetSection("SqliteSettings"));
services.AddMvc();
}
它应该有用。
答案 1 :(得分:5)
根据Microsoft Docs:“当GetSection返回匹配的节时,不会填充Value。当该节存在时,将返回Key和Path。”
如果要查看该部分的值,则需要调用GetChildren()方法:Configuration.GetSection("SqliteSettings").GetChildren();
或者您可以使用:
Configuration.GetSection("SqliteSettings").Get<SqliteSettings>()
。 JSON不需要具有相同数量的属性即可匹配。不匹配的可为空的属性将设置为null,不可匹配的不可为空的属性将设置为其默认值(例如,int将设置为0)。
答案 2 :(得分:2)
appsettings.json
,然后转到“属性”。答案 3 :(得分:0)
这在我的控制台应用程序中起作用了:
var connectionString = config["ConnectionStrings:DefaultConnection"]
答案 4 :(得分:0)
var serviceProvider = services.BuildServiceProvider();
必须在所有services.Configure
个电话之后进行。
答案 5 :(得分:0)
对于Web Api Core 2.1,我需要项目根文件夹(与Startup.cs相同的文件夹)中的Program.cs
。
答案 6 :(得分:0)
尝试将ConfigurationProvider添加到ConfigurationBuilder。
应用程序配置从以下位置提供:
答案 7 :(得分:0)
如果所有其他答案都不能解决问题,则另一个原因可能是Options类的属性是私有的(或没有可访问的setter)。
答案 8 :(得分:0)
我的问题是.bind()方法的对象实例未初始化。
predict(mod1, data.frame(Week=1:10, Sex=factor(FACTORfemale), No_Squares=NEWSQUARES),
type="response"
# , se=TRUE ## unused argument
)
# 1 2 3 4 5 6 7 8 9 10 11 12
# 11.91329 11.67287 12.21171 11.29497 11.74180 11.73457 11.04548 11.78727 11.33035 11.55541 12.10291 11.85865
# 13 14 15 16 17 18 19 20 21 22 23 24
# 12.40607 11.47474 11.92869 11.92134 11.22128 11.97488 11.51069 11.73933 12.29554 12.04740 12.60353 11.65738
# 25 26 27 28 29 30 31 32 33 34 35 36
# 12.11855 12.11109 11.39988 12.16548 11.69390 11.92618 12.49124 12.23915 12.80414 11.84292 12.31143 12.30385
# 37 38 39 40 41 42 43 44 45 46 47 48
# 11.58133 12.35911 11.88002 12.11600 12.69005 12.43395 13.00793 12.03141 12.50738 12.49968 11.76566 12.55582
# 49 50 51 52 53 54 55 56 57 58 59 60
# 12.06911 12.30884 12.89203 12.63186 13.21497 12.22291 12.70645 12.69863 11.95292 12.75566 12.26120 12.50475
# 61 62 63 64 65 66 67 68 69 70 71 72
# 13.09723 12.83291 13.42530 12.41745 12.90869 12.90075 12.14317 12.95869 12.45635 12.70378 13.30569 13.03716
# 73 74 75 76 77 78 79 80 81 82 83 84
# 13.63898 12.61509 13.11415 13.10608 12.33644 13.16494 12.65461 12.90598 13.51746 13.24466 13.85607 12.81588
# 85 86 87 88 89 90 91 92 93 94 95 96
# 13.32288 13.31468 12.53280 13.37448 12.85603 13.11139 13.73261 13.45547 14.07660 13.01986 13.53493 13.52660
# 97 98 99 100
# 12.73227 13.58735 13.06065 13.32008
因此,在调用.bind(opts);之前;我初始化了值:
services.Configure<SqliteSettings>(opts => Configuration.GetSection("SqliteSettings").Bind(opts));
绑定本地设置变量:
SqlliteSettings opts = new SqliteSettings();
分别对容器进行注册:
Configuration.GetSection(AppSettingsSectionName).Bind(opts);
这解决了问题,因为当提供的实例为null时,.Bind()方法将仅返回null。
答案 9 :(得分:0)
如果你的依赖注入失败了,并且你在调试之后断定是这个方法有问题,那就不是!
注册就够了:
services.Configure<SqliteSettings>(Configuration.GetSection("SqliteSettings"));
您必须在 IOptions 接口中注入您的配置类。这将解决DI问题。我在这个问题上浪费了几个小时,希望它可以帮助其他人。
答案 10 :(得分:-1)
如果您有appsettings.Development.json
文件,请确保appsettings.Development.json
和appsettings.json
文件中的“ ConnectionStrings:DefaultConnection”设置相同。