как получить значение от appsettings.json

public class Bar
{
    public static readonly string Foo = ConfigurationManager.AppSettings["Foo"];
}

В.NET Framework 4.x я могу использовать ConfigurationManager.AppSettings ["Foo"] чтобы получить Foo в Webconfig, а затем я могу легко получить значение Foo через Bar.Foo

Но в ядре.Net я должен вводить options, и не могу получить значение Foo через Bar.Foo

Есть ли метод, который может быть непосредственно через Bar.Foo чтобы получить значение Foo?

Ответ 1

Таким образом, есть два способа обойти это.

Вариант 1: класс опций

У вас есть файл appsettings.json:

{
  "myConfiguration": {
    "myProperty": true 
  }
}

Вы создаете POCO конфигурации так:

public class MyConfiguration
{
    public bool MyProperty { get; set; }
}

В вашем startup.cs у вас есть что-то в вашем ConfigureServices, которое регистрирует конфигурацию:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MyConfiguration>(Configuration.GetSection("myConfiguration"));
}

Затем в вашем контроллере/службе вы вводите в IOptions и его можно использовать.

public class ValuesController : Controller
{
    private readonly MyConfiguration _myConfiguration;

    public ValuesController(IOptions<MyConfiguration> myConfiguration)
    {
        _myConfiguration = myConfiguration.Value;
    }
}

Лично мне не нравится использовать IOptions, потому что я думаю, что он тянет вперед какой-то дополнительный барахло, которого я действительно не хочу, но вы можете делать такие классные вещи, как горячая замена и прочее.

Вариант 2: Конфигурация POCO

Это в основном то же самое, но в вашем методе Configure Services вместо этого вы привязываетесь к одиночному элементу своего POCO.

public void ConfigureServices(IServiceCollection services)
{
    //services.Configure<MyConfiguration>(Configuration.GetSection("myConfiguration"));
    services.AddSingleton(Configuration.GetSection("myConfiguration").Get<MyConfiguration>());
}

И тогда вы можете просто ввести POCO напрямую:

public class ValuesController : Controller
{
    private readonly MyConfiguration _myConfiguration;

    public ValuesController(MyConfiguration myConfiguration)
    {
        _myConfiguration = myConfiguration;
    }
}

Немного упрощен, потому что вы, вероятно, должны использовать интерфейс, чтобы сделать модульное тестирование немного проще, но вы поняли эту идею.

В основном взяты отсюда: http://dotnetcoretutorials.com/2016/12/26/custom-configuration-sections-asp-net-core/

Ответ 2

Вы также можете использовать конфигурацию напрямую. Ваши настройки вводятся так, что вы можете добраться до них с помощью DI...

private readonly IConfiguration _configuration;

public MyClass(IConfiguration configuration)
{
    _configuration = configuration;
}

а затем вы можете прочитать свои настройки...

В этом случае я получаю коллекцию обратно...

var myList = _configuration.GetSection("MyList").Get<List<string>>();