C# – Come leggere le configurazioni personalizzate da appsettings.json

C# – Come leggere le configurazioni personalizzate da appsettings.json

Il file appsettings.json è un modo conveniente per archiviare e recuperare la configurazione dell'applicazione. Puoi aggiungerlo a qualsiasi progetto e quindi utilizzare la libreria Microsoft.Extensions.Configuration per lavorarci.

Poiché appsettings.json è solo un file JSON, puoi aggiungere qualsiasi cosa (purché sia ​​JSON valido). Rispetto all'utilizzo di app.config basato su XML delle versioni precedenti di .NET, la gestione delle personalizzazioni in appsettings.json è più semplice e flessibile.

Questo articolo mostra passo dopo passo come aggiungere configurazioni personalizzate ad appsettings.json e come caricare le tue personalizzazioni con passaggi specifici per il tipo di progetto in cui stai lavorando (ASP.NET Core e tutto il resto).

Lettura di una classe personalizzata da appsettings.json in un'app console (o qualsiasi progetto oltre ad ASP.NET Core)

Se non stai lavorando in ASP.NET Core, devi fare un po' più di lavoro per poter leggere i valori da appsettings.json. Fondamentalmente devi aggiungere il file appsettings.json, aggiungere i pacchetti di estensione di configurazione, inizializzare l'oggetto di configurazione, quindi leggere i tuoi valori personalizzati dalla configurazione.

1 – Aggiungi il file appsettings.json

Non c'è niente di speciale in questo file. È solo un file JSON. Per aggiungerlo a qualsiasi progetto:

  • Aggiungi nuovo elemento.
  • Nominalo appsettings.json.
  • Inizializzalo come un file JSON vuoto:
{
  
}
Code language: JSON / JSON with Comments (json)
  • Fai copiare appsettings.json nella cartella di output. Puoi farlo nell'interfaccia utente o aggiungendo quanto segue al file .csproj:
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>

Code language: HTML, XML (xml)

2 – Installa i pacchetti nuget di configurazione

  • Apri Console Gestione pacchetti (Visualizza> Altre finestre> Console di gestione pacchetti)
  • Installa i pacchetti:
Install-Package Microsoft.Extensions.Configuration.Json
Install-Package Microsoft.Extensions.Configuration.Binder
Code language: PowerShell (powershell)

Questo estrarrà gli ultimi pacchetti e inserirà i riferimenti ai pacchetti nel tuo file .csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.9" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.9" />
  </ItemGroup>

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>

Code language: HTML, XML (xml)

3 – Aggiungi una classe personalizzata – WeatherClientConfig

public class WeatherClientConfig
{
	public bool IsEnabled { get; set; }
	public string WeatherAPIUrl { get; set; }
	public string Timeout { get; set; }
}
Code language: C# (cs)

4 – Aggiungi la classe personalizzata JSON a appsettings.json

{
  "WeatherClientConfig": {
    "IsEnabled": true,
    "WeatherAPIUrl": "https://localhost:12345",
    "Timeout": 5000
  }
}
Code language: JSON / JSON with Comments (json)

5 – Leggi la configurazione personalizzata da appsettings.json

Per leggere la configurazione personalizzata, utilizzare ConfigurationBuilder per compilare l'oggetto di configurazione. Quindi usa configuration.GetSection() per ottenere la tua classe personalizzata JSON, quindi usa Get() per deserializzarla nella tua classe personalizzata.

Come puoi vedere di seguito, tutto il duro lavoro viene astratto grazie ai pacchetti Microsoft.Extension.Configuration.

using Microsoft.Extensions.Configuration;
using System;

namespace ReadingAppSettingsJson
{
    class Program
    {
        static void Main(string[] args)
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
                .AddJsonFile("appsettings.json").Build();


            var section = config.GetSection(nameof(WeatherClientConfig));
            var weatherClientConfig = section.Get<WeatherClientConfig>();

            Console.WriteLine(weatherClientConfig.WeatherAPIUrl);
            Console.WriteLine(weatherClientConfig.IsEnabled);
            Console.WriteLine(weatherClientConfig.Timeout);
        }
    }
}


Code language: C# (cs)

Come previsto, questo restituisce i valori dalla sezione WeatherClientConfig in appsettings.json:

https://localhost:12345
True
5000Code language: plaintext (plaintext)

Lettura di una classe personalizzata da appsettings.json in ASP.NET Core

Il framework ASP.NET Core fa la maggior parte del lavoro per te. Per impostazione predefinita, ha i pacchetti di configurazione come riferimenti, ha il file appsettings.json incluso nel progetto e inizializza già l'oggetto Configuration da appsettings.json.

Devi solo aggiungere le tue personalizzazioni a appsettings.json, creare facoltativamente una classe personalizzata e quindi caricarla in Startup.ConfigureServices.

Per rendere questa spiegazione coerente con il modo in cui ho mostrato come farlo in un'app console, sto usando una classe personalizzata:WeatherClientConfig.

Nota:se non vuoi aggiungere la tua classe personalizzata, puoi usare services.Configure(customSection) e iniezione di dipendenza IOptions. Mostro qui l'approccio di classe personalizzato.

1 – Aggiungi una classe personalizzata

public class WeatherClientConfig
{
	public bool IsEnabled { get; set; }
	public string WeatherAPIUrl { get; set; }
	public string Timeout { get; set; }
}
Code language: C# (cs)

2 – Aggiungi la classe personalizzata JSON a appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "WeatherClientConfig": {
    "IsEnabled": true,
    "WeatherAPIUrl": "https://localhost:12345",
    "Timeout": 5000
  }
}

Code language: JSON / JSON with Comments (json)

3 – Registra la classe personalizzata in Startup.ConfigureServices

public class Startup
{
	public void ConfigureServices(IServiceCollection services)
	{
		services.AddControllers();

		var section = Configuration.GetSection(nameof(WeatherClientConfig));
		var weatherClientConfig = section.Get<WeatherClientConfig>();

		services.AddSingleton(weatherClientConfig);
	}
//The rest of Startup class	
}
Code language: C# (cs)

4 – La dipendenza inietta la classe personalizzata in un controller

Sfrutta la funzionalità di inserimento delle dipendenze di ASP.NET Core. A causa della registrazione di WeatherClientConfig nella raccolta dei servizi nel passaggio precedente, tutto ciò che ha WeatherClientConfig come dipendenza (ad es. parametro del costruttore) riceverà automaticamente l'oggetto registrato passato.

Quindi aggiungi WeatherClientConfig come parametro in un controller e aggiungi un endpoint GET che restituisca semplicemente questa configurazione (in modo che tu possa vederlo funzionare con una semplice richiesta GET).

[ApiController]
[Route("[controller]")]
public class WeatherController : ControllerBase
{

	private readonly WeatherClientConfig weatherClientConfig;

	public WeatherController(WeatherClientConfig weatherClientConfig)
	{
		this.weatherClientConfig = weatherClientConfig;

	}

	[HttpGet]
	public WeatherClientConfig Get()
	{
		return weatherClientConfig;
	}
}
Code language: C# (cs)

Quando eseguo una richiesta GET su questo endpoint, ottengo il JSON WeatherClientConfig:

{
  "isEnabled": true,
  "weatherAPIUrl": "https://localhost:12345",
  "timeout": "5000"
}
Code language: JSON / JSON with Comments (json)

Lettura di un singolo valore da appsettings.json

Le sezioni precedenti hanno spiegato come leggere una classe personalizzata da appsettings.json. E se volessi un solo valore?

Ottieni un singolo valore all'interno di una sezione

Supponiamo che il tuo appsettings.json assomigli a questo:

{
  "WeatherClientConfig": {
    "IsEnabled": true,
    "WeatherAPIUrl": "https://localhost:12345",
    "Timeout": 5000
  }
}
Code language: JSON / JSON with Comments (json)

Per ottenere WeatherClientConfig.IsEnabled (senza ottenere l'intero oggetto WeatherClientConfig), puoi utilizzare una di queste due opzioni:

//option 1 - GetValue(sectionName:key)
var weatherIsEnabled = config.GetValue<bool>("WeatherClientConfig:IsEnabled");

//option 2 - GetSection(sectionName) + GetValue(key)
var weatherIsEnabled = config.GetSection("WeatherClientConfig").GetValue<bool>("IsEnabled");
Code language: C# (cs)

Nota:se manca la sezione WeatherClientConfig o la proprietà IsEnabled, entrambe queste opzioni restituiranno false.

Ottieni un unico valore di primo livello

Che ne dici se vuoi ottenere un singolo valore non contenuto in una sezione? Ad esempio, supponiamo che il tuo appsettings.json assomigli a questo:

{
  "Debug": true
}
Code language: JSON / JSON with Comments (json)

Per ottenere Debug , usa questo:

var debug = config.GetValue<bool>("Debug");
Code language: C# (cs)

Nota:se la proprietà Debug non fosse presente in appsettings.json, verrebbe restituito false.