Sezione di configurazione principale di ASP.NET in Avvio

Sto migrando un progetto RC1 ASP.NET 5 in ASP.NET Core e ho trovato un problema interessante che non ho ancora visto o trovato una soluzione.

Per poter utilizzare le impostazioni di configurazione all’interno di Avvio, ho precedentemente recuperato la configurazione nel seguente modo

// Works fine for DI both in ASP.NET 5 RC1 and ASP.NET Core services.Configure(Configuration.GetSection("SomeConfigurationSection")); // How I previous retrieved the configuration for use in startup. // No longer available in ASP.NET Core var someConfigurationToUseLater = Configuration.Get("SomeConfigurationSection"); 

Dopo l’aggiornamento ad ASP.NET Core 1.0 sembra Configuration.Get () non è più disponibile.

Ho provato ad aggiornare il codice per utilizzare Configuration.GetValue () ma questo non sembra funzionare con gli oggetti e funzionerà solo quando fornirai un percorso per un valore. Questo mi ha lasciato una soluzione per la maggior parte delle mie classi di configurazione in questo modo

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

Tuttavia questo è un problema quando la class di configurazione contiene una matrice di oggetti. Nel mio caso una matrice di oggetti Client

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

Con la seguente configurazione

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

Dove questo si legava in precedenza alla proprietà Clients della mia class di configurazione senza problemi, non riesco più a trovare un modo per farlo in ASP.NET Core 1.0

Risposta aggiornata
Per il binding di modello generico di ASP Core 1.1.0 ora viene eseguito utilizzando Get :

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

Risposta originale
Cosa ne pensi di questo:

 var config = Configuration.GetSection("configuredClients").Bind(); 

Non si legge la configurazione manualmente in genere in ASP.NET Core, ma si crea un object che corrisponde alla propria definizione. Puoi leggere di più su questo nella documentazione ufficiale qui .

Per esempio

 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(Configuration); } 

Quindi devi semplicemente iniettare le opzioni IOptions dove ti servono.

Con ASP.NET Core 2.0 (fondamentalmente Core 1.1+), IConfiguration viene iniettato su Startup e può essere utilizzato all’interno dei metodi ConfigureServices() e Configure() .

Come mostrato nella risposta accettata, la configurazione può essere associata a un object. Ma se è richiesto un solo valore, l’approccio basato sulla chiave funziona bene.

IConfiguration funziona ancora con due punti : tasti stringa separati. E per l’ array , usa l’indice a 0. Oppure usa il metodo generico getValue() con le stesse chiavi. Vedi l’esempio qui sotto:

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

Per utilizzare gli stessi valori di configurazione in altre classi (ad es. Controllori)

  1. IConfiguration e utilizzare lo stesso approccio basato su tasti come sopra. O
  2. Registrare un’istanza dell’object di configurazione fortemente tipizzata con il contenitore DI e immetterlo direttamente nelle classi client.

Esempio di codice qui sotto:

 //In Startup.ConfigureServices() var clientConfig = Configuration.GetSection("configuredClients") .Get(); 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("configuredClients:clients:0:clientId"); //with strongly typed ClientConfiguration var clientName1 = _clientConfiguration.Clients[0]?.ClientName; return new OkObjectResult("Configuration test"); } } 

Altri esempi qui .

Se si desidera ottenere prima “clientName” (previsto “Client1”), è sufficiente scrivere:

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

Aggiornamento per il commento

Installa .NET Core 1.0.1 e vai con il modo @ TomMakin.