配置为空

时间:2019-10-14 11:52:46

标签: c# configuration .net-core-3.0

我正在尝试从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}}。

但是这些似乎无法从代码中访问。

我使用了错误的类/命名空间吗?我应该如何读取这些值?

3 个答案:

答案 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 文件夹中)。尝试右键单击文件 -> 选择属性并设置为如果更新则复制始终复制。这将确保文件被正确复制并被配置逻辑找到。