我正在尝试从appsettings.json
中读取配置数据,如下所示:
{
Owner: {
Name: "Dave",
City: "Dusseldorf"
}
}
在Startup.cs中,我有:
public Startup(IConfiguration configuration)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
}
我在课堂上有
private readonly IConfiguration _configuration;
public MyClass(
IConfiguration configuration
)
{
_configuration = configuration;
}
...以及后来在同一班上
string name= _configuration["Owner.Name"];
但这总是空的。
但是,如果在该行上添加一个断点并扩展_configuration类,则可以看到Providers (Count = 5)
的列表,其中包括appsettings.json
的列表,如果扩展此列表,则可以看到我的设置值,包括{{ 1}}。
但是这些似乎无法从代码中访问。
我使用了错误的类/命名空间吗?我应该如何读取这些值?
答案 0 :(得分:1)
这可能更多是设计问题。真的不应该将IConfiguration
注入Startup
的外部。
考虑创建所需配置的POCO模型。
public class MyClassOptions {
public string Name { get; set; }
public string City { get; set; }
}
并使目标类依赖于强类型模型
public class MyClass {
private readonly MyClassOptions options;
public MyClass(MyClassOptions options) {
this.options = options;
}
public void SomeMethod() {
string name = options.Name;
string city = options.City;
//...
}
//...
}
在Startup
中,如前所示访问配置,但提取所需的配置详细信息。
public class Startup {
IConfiguration Configuration;
public Startup() {
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services) {
//Bind to object graph from configuration
MyClassOptions options = Configuration.GetSection("Owner").Get<MyClassOptions>();
//make it available to the service collection for Dependency Injection
services.AddSingleton<MyClassOptions>(options);
services.AddTransient<MyClass>();
//...
}
}
解决MyClass
后,将从配置中提取的选项注入。
这样,目标类就不会与框架细节紧密耦合。
答案 1 :(得分:1)
通过构建器构建构建的配置需要添加到可用服务中。
var configuration = builder.Build();
services.AddSingleton<IConfiguration>(configuration);
请注意,您没有向我们显示您的真实代码(即Startup不符合要求,缺少返回类型声明,我们不知道Configuration
是什么),所以我在猜测您的设置。 / p>
答案 2 :(得分:1)
发生这种情况的最糟糕的原因之一是您的 appsettings.json 未构建(复制到 bin 文件夹中)。尝试右键单击文件 -> 选择属性并设置为如果更新则复制或始终复制。这将确保文件被正确复制并被配置逻辑找到。