配置为空
Configuration is empty
我正在尝试从 appsettings.json
读取配置数据,如下所示:
{
Owner: {
Name: "Dave",
City: "Dusseldorf"
}
}
在Startup.cs我有:
public Startup(IConfiguration configuration)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
}
在我的 class 我有
private readonly IConfiguration _configuration;
public MyClass(
IConfiguration configuration
)
{
_configuration = configuration;
}
...后来在同一个 class
string name= _configuration["Owner.Name"];
但这总是空的。
但是,如果我在该行添加一个断点并展开 _configuration class,我可以看到 Providers (Count = 5)
的列表,其中包括一个 appsettings.json
,如果我展开它,我可以看到我的设置值, 包括 Name
.
然而,这些似乎无法通过代码访问。
我是不是用错了class/namespace?我应该如何读取这些值?
这可能更多是设计问题。真的不应该在 Startup
.
之外注入 IConfiguration
考虑创建所需配置的 POCO 模型。
public class MyClassOptions {
public string Name { get; set; }
public string City { get; set; }
}
并让目标 class 依赖于强类型模型
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
后,将注入从配置中提取的选项。
这样目标 class 就不会与框架细节紧密耦合。
通过构建器构建的配置需要添加到可用服务中。
var configuration = builder.Build();
services.AddSingleton<IConfiguration>(configuration);
请注意,您没有向我们展示您的真实代码(即 Startup 不符合要求,它缺少 return 类型声明,我们不知道 Configuration
是什么)所以我正在制作猜测你的设置。
发生这种情况的最糟糕的原因之一是您的 appsettings.json 未构建(复制到 bin 文件夹中)。尝试 右键单击 文件 -> select 属性 并设置为 如果更新则复制 或 始终复制 。这将确保配置逻辑正确复制和找到文件。
我正在尝试从 appsettings.json
读取配置数据,如下所示:
{
Owner: {
Name: "Dave",
City: "Dusseldorf"
}
}
在Startup.cs我有:
public Startup(IConfiguration configuration)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
}
在我的 class 我有
private readonly IConfiguration _configuration;
public MyClass(
IConfiguration configuration
)
{
_configuration = configuration;
}
...后来在同一个 class
string name= _configuration["Owner.Name"];
但这总是空的。
但是,如果我在该行添加一个断点并展开 _configuration class,我可以看到 Providers (Count = 5)
的列表,其中包括一个 appsettings.json
,如果我展开它,我可以看到我的设置值, 包括 Name
.
然而,这些似乎无法通过代码访问。
我是不是用错了class/namespace?我应该如何读取这些值?
这可能更多是设计问题。真的不应该在 Startup
.
IConfiguration
考虑创建所需配置的 POCO 模型。
public class MyClassOptions {
public string Name { get; set; }
public string City { get; set; }
}
并让目标 class 依赖于强类型模型
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
后,将注入从配置中提取的选项。
这样目标 class 就不会与框架细节紧密耦合。
通过构建器构建的配置需要添加到可用服务中。
var configuration = builder.Build();
services.AddSingleton<IConfiguration>(configuration);
请注意,您没有向我们展示您的真实代码(即 Startup 不符合要求,它缺少 return 类型声明,我们不知道 Configuration
是什么)所以我正在制作猜测你的设置。
发生这种情况的最糟糕的原因之一是您的 appsettings.json 未构建(复制到 bin 文件夹中)。尝试 右键单击 文件 -> select 属性 并设置为 如果更新则复制 或 始终复制 。这将确保配置逻辑正确复制和找到文件。