Конфигурация пуста - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь прочитать данные конфигурации из 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, и если я разверну его, я смогу увидеть значения моих настроек, включая Name.

Однако кажется, что они не доступны из кода.

Я использую неправильный класс / пространство имен? Как мне прочитать эти значения?

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Конфигурация, созданная с помощью сборки компоновщика, должна быть добавлена ​​к доступным сервисам.

var configuration = builder.Build(); 
services.AddSingleton<IConfiguration>(configuration);

Обратите внимание, что вы не показываете нам свой реальный код (т. Е. Запуск не завершится, отсутствует декларация возвращаемого типа, мыне знаю, что такое Configuration), поэтому я догадываюсь о вашей настройке.

1 голос
/ 14 октября 2019

Это может быть скорее проблемой дизайна. На самом деле не следует вводить 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, параметры, извлеченные из конфигурации, будутбыть внедрённым.

Таким образом, целевой класс не тесно связан с деталями каркаса.

...