配置为空

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 属性 并设置为 如果更新则复制 始终复制 。这将确保配置逻辑正确复制和找到文件。