it-roy-ru.com

Раздел конфигурации ядра ASP.NET при запуске

Я мигрирую проект ASP.NET 5 RC1 в ASP.NET Core, и столкнулся с интересной проблемой, которую я еще не видел, или не нашел решения.

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

// Works fine for DI both in ASP.NET 5 RC1 and ASP.NET Core
services.Configure<SomeConfigurationClass>(Configuration.GetSection("SomeConfigurationSection"));

// How I previous retrieved the configuration for use in startup. 
// No longer available in ASP.NET Core
var someConfigurationToUseLater = Configuration.Get<SomeConfigurationClass>("SomeConfigurationSection");

После обновления до ASP.NET Core 1.0 кажется, что Configuration.Get <T> () больше не доступен.

Я попытался обновить код для использования Configuration.GetValue <T> (), однако это не похоже на работу с объектами и будет работать только при указании пути к значению. Это оставило мне обходной путь для большинства моих классов конфигурации, например, так

var someConfigurationName = "someConfiguration";    
var someConfigurationClass = new SomeConfigurationClass()
{
    Value1 = Configuration.GetValue<string>($"{someConfigurationName}:value1"),
    Foo = Configuration.GetValue<string>($"{someConfigurationName}:foo"),
    Bar = Configuration.GetValue<string>($"{someConfigurationName}:bar")
};

Однако это проблема, когда класс конфигурации содержит массив объектов. В моем случае массив объектов Client

public class ClientConfiguration
{
    public Client[] Clients { get; set; }
}

Со следующей конфигурацией

"configuredClients": {
  "clients": [
    {
      "clientName": "Client1",
      "clientId": "Client1"
    },
    {
      "clientName": "Client2",
      "clientId": "Client2"
    }
  ]
}

Там, где это ранее не связывалось со свойством Clients моего класса конфигурации, я больше не могу найти способ сделать это в ASP.NET Core 1.0

35
Aaron Bamford

Обновленный ответ
Для ASP привязка общей модели Core 1.1.0 теперь выполняется с использованием Get:

var config = Configuration.GetSection("configuredClients").Get<ClientConfiguration>();

Оригинальный ответ
Как насчет этого:

var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>();
57
Tom Makin

Обычно вы не читаете конфигурацию вручную в ASP.NET Core самостоятельно, вместо этого вы создаете объект, который соответствует вашему определению. Вы можете прочитать об этом в официальной документации здесь .

Например.

public class MyOptions
{
    public string Option1 { get; set; }
    public int Option2 { get; set; }
}

public void ConfigureServices(IServiceCollection services)
{
    // Setup options with DI
    services.AddOptions();
    services.Configure<MyOptions>(Configuration);
}

Затем вы просто вводите параметры IOptions<MyOptions> там, где они вам нужны.

2
Ilya Chernomordik

В ASP.NET Core 2.0 (в основном Core 1.1+) IConfiguration внедряется в Startup, и это можно использовать в методах ConfigureServices() и Configure().

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

IConfiguration по-прежнему работает с разделенными : строковыми ключами. А для array используйте индекс на основе 0. Или используйте общий метод getValue<T>() с теми же ключами. Смотрите пример ниже:

var clientId2 = Configuration["configuredClients:clients:1:clientId"]?.ToString();
var clientName1 = Configuration.GetValue<string>("configuredClients:clients:0:clientName");

Чтобы использовать те же значения конфигурации в других классах (например, контроллеры)

  1. Либо введите IConfiguration, и используйте тот же подход на основе ключей, что и выше. Или же
  2. Зарегистрируйте экземпляр строго типизированного объекта конфигурации в контейнере DI и вставьте этот объект непосредственно в клиентские классы.

Пример кода ниже:

//In Startup.ConfigureServices()
var clientConfig = Configuration.GetSection("configuredClients")
    .Get<ClientConfiguration>();
services.AddSingleton(clientConfig);

//Controller
public class TestController : Controller
{
    IConfiguration _configStore;
    ClientConfiguration _clientConfiguration;

    public TestController(IConfiguration configuration, 
        ClientConfiguration clientConfiguration)
    {
        _configStore = configuration;
        _clientConfiguration = clientConfiguration;
    }

    public IActionResult Get()
    {
        //with IConfiguration
        var clientId1 = _configStore
            .GetValue<string>("configuredClients:clients:0:clientId");

        //with strongly typed ClientConfiguration
        var clientName1 = _clientConfiguration.Clients[0]?.ClientName;

        return new OkObjectResult("Configuration test");
    }
}

Больше примеров здесь .

2
Arghya C

Если вы хотите получить первое «clientName» (ожидаемое «Client1»), просто напишите:

Configuration.GetSection("configuredClients")["clients:0:clientName"];

Обновление для комментария

Установите .NET Core 1.0.1 и следуйте пути @ TomMakin.

0
adem caglin