2016-11-03 3 views
29

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

Для того чтобы использовать параметры конфигурации в пределах Запуск я ранее retrived на страницу настройки следующим образом

// 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 1.0 Ядро, кажется Configuration.Get < Т >() больше не доступен ,

Я пробовал обновить код для использования 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") 
}; 

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

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

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

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

Где это было ранее связывать свойства Клиентов моей конфигурации класса проблем нет, я больше не могу найти способ делать это в ASP.NET Ядра 1,0

ответ

46

Изменено Ответ
Для ASP Ядро 1.1.0 общая модель связывания теперь осуществляется с помощью Get:

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

Оригинал ответа
Как об этом:

var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>(); 
+0

Еще один голос за такой подход. Я использую этот подход уже несколько недель, и он отлично работает. –

+0

Возможно, стоит отметить, что мне нужно было обновить Microsoft.Extensions.Configuration и Microsoft.Extentions.Options.ConfigurationExtensions to 1.1.0-preview1-final –

+0

Было ли это удалено снова в окончательной версии 1.1? – AndyM

2

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

E.g.

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>, где они нужны.

+0

То же самое не работает, даже если объект конфигурации и объект json совпадают по пути, который вы предлагаете, я все еще получаю null , Настройка службы и инъекции IOptions позже, похоже, отлично восстанавливает значения конфигурации. Проблема в том, что когда я пытаюсь извлечь эти значения для использования в Startup –

+0

Я не уверен на 100%, что вы имеете в виду, но использовал бы контейнер DI во время настройки метода? Я думаю, что можно использовать контейнер там, но не могу найти, как это сделать. –

+0

Это хорошая статья о том, как использовать строго типизированные разделы конфигурации: [Как использовать шаблон IOptions для конфигурации в ASP.NET Core RC2] (http://andrewlock.net/how-to-use-the-ioptions- pattern-for-configuration-in-asp-net-core-rc2 /) – 108

0

Если вы хотите, чтобы получить первый "CLIENTNAME" (ожидаемый "Client1"), просто написать:

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

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

Установка .NET ядра 1.0.1 и пойти с @ Путь Томакина.

+0

Я хочу, чтобы весь список клиентов, очевидно, с его настраиваемым количеством х число клиентов, которое нужно использовать позже в настройке конфигурации. Так что это не реально жизнеспособное решение. –

+0

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

0

С 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"); 
    } 
} 

Больше примеров here.

 Смежные вопросы

  • Нет связанных вопросов^_^