Раздел конфигурации ядра 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"
}
]
}
Если это ранее не связывалось с свойством Клиентов моего конфигурационного класса, я больше не могу найти способ сделать это в ASP.NET Core 1.0
Ответы
Ответ 1
Обновленный ответ
Для привязки общей версии ASP Core 1.1.0 теперь используется Get
:
var config = Configuration.GetSection("configuredClients").Get<ClientConfiguration>();
Оригинальный ответ
Как насчет этого:
var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>();
Ответ 2
Вы не читаете конфигурацию вручную обычно в 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>
там, где они вам нужны.
Ответ 3
Если вы хотите получить первое "clientName" (ожидаемое "Client1" ), просто напишите:
Configuration.GetSection("configuredClients")["clients:0:clientName"];
Обновить для комментариев
Установите .NET Core 1.0.1 и перейдите по пути @TomMakin.
Ответ 4
С 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");
Чтобы использовать те же значения конфигурации в других классах (например, контроллеры)
- Либо введите
IConfiguration
, либо используйте тот же подход на основе ключевых слов, как описано выше. Или
- Зарегистрировать экземпляр строго типизированного объекта конфигурации с контейнером 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");
}
}
Другие примеры здесь.