0Pricing
C# Academy · Lezione

Fonti e provider di configurazione

Combini la configurazione proveniente da file JSON, variabili d'ambiente, argomenti della riga di comando e provider personalizzati, assegnando loro una priorità.

Fonti e provider di configurazione è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.

Configurazione in .NET

Il sistema di configurazione di ASP.NET Core legge le impostazioni da più origini — file JSON, variabili d'ambiente, argomenti della riga di comando e altro — e le unisce in un unico archivio piatto di coppie chiave-valore, accessibile da qualsiasi punto dell'applicazione.

appsettings.json

appsettings.json è il file di configurazione predefinito. Viene caricato automaticamente da Host.CreateApplicationBuilder. Le impostazioni vengono unite alle sovrascritture specifiche dell'ambiente.

// appsettings.json
{
  "App": {
    "Name": "OrderService",
    "MaxRetries": 3
  },
  "ConnectionStrings": {
    "Default": "Server=localhost;Database=orders"
  }
}

// appsettings.Production.json overrides the above:
{
  "ConnectionStrings": {
    "Default": "Server=prod-db;Database=orders;..."
  }
}

Lettura dei valori di configurazione

Acceda alla configurazione tramite IConfiguration. Per gli oggetti annidati, le chiavi utilizzano la notazione con i due punti. Gli array vengono indicizzati tramite la posizione.

// Inject IConfiguration
public class OrderService
{
    private readonly IConfiguration _config;

    public OrderService(IConfiguration cfg) => _config = cfg;

    public void Configure()
    {
        string? name     = _config["App:Name"];           // "OrderService"
        int maxRetries   = _config.GetValue<int>("App:MaxRetries"); // 3
        string? connStr  = _config.GetConnectionString("Default");

        // Nested section
        var section = _config.GetSection("App");
        string? appName = section["Name"];
    }
}

Variabili d'ambiente

Le variabili d'ambiente sovrascrivono le impostazioni JSON e sono essenziali per le distribuzioni in container. I doppi caratteri di sottolineatura (__) sostituiscono i separatori con i due punti nelle chiavi annidate.

# Set via shell or docker-compose:
export App__Name="OrderService-Prod"
export App__MaxRetries=5
export ConnectionStrings__Default="Server=prod-db;..."

// Equivalent to:
{
  "App": { "Name": "OrderService-Prod", "MaxRetries": 5 },
  "ConnectionStrings": { "Default": "Server=prod-db;..." }
}

// Priority: env vars > appsettings.{Environment}.json > appsettings.json

Argomenti della riga di comando

Per impostazione predefinita, gli argomenti della riga di comando hanno la priorità più alta. Utilizzano la sintassi --key=value o --key value, con i due punti o i doppi caratteri di sottolineatura per rappresentare i livelli annidati.

# Override config when launching the app:
dotnet run --App:Name="CLI-Override" --App:MaxRetries=10

# Or:
dotnet run --App__Name="CLI-Override"

// The builder.Configuration.AddCommandLine() is called
// automatically by Host.CreateApplicationBuilder().

// Priority order (highest to lowest):
// 1. Command-line args
// 2. Environment variables
// 3. appsettings.{ASPNETCORE_ENVIRONMENT}.json
// 4. appsettings.json

User Secrets

User Secrets archivia la configurazione sensibile al di fuori della directory del progetto durante lo sviluppo. I dati non vengono mai inseriti nel controllo del codice sorgente e sovrascrivono localmente appsettings.json.

# Initialize user secrets for the project:
dotnet user-secrets init

# Set a secret:
dotnet user-secrets set "Database:Password" "SuperSecret123"
dotnet user-secrets set "Jwt:SecretKey" "dev-only-key"

# List secrets:
dotnet user-secrets list

# Remove:
dotnet user-secrets remove "Database:Password"

# Stored in: ~/.microsoft/usersecrets/{projectId}/secrets.json
# Automatically loaded in Development environment only

Provider di configurazione personalizzati

Implementi IConfigurationProvider e IConfigurationSource per caricare la configurazione da qualsiasi origine — database, Consul, Vault, Redis e così via.

public class DbConfigProvider : ConfigurationProvider
{
    private readonly string _connStr;
    public DbConfigProvider(string connStr) => _connStr = connStr;

    public override void Load()
    {
        using var conn = new NpgsqlConnection(_connStr);
        conn.Open();
        using var cmd = new NpgsqlCommand(
            "SELECT key, value FROM app_config", conn);
        using var reader = cmd.ExecuteReader();
        while (reader.Read())
            Data[reader.GetString(0)] = reader.GetString(1);
    }
}

public class DbConfigSource : IConfigurationSource
{
    private readonly string _connStr;
    public DbConfigSource(string connStr) => _connStr = connStr;
    public IConfigurationProvider Build(IConfigurationBuilder b)
        => new DbConfigProvider(_connStr);
}

Registrazione di un provider personalizzato

Aggiunga un'origine di configurazione personalizzata al builder prima di chiamare Build(). Questa si inserisce nella stessa catena di priorità dei provider integrati.

var builder = Host.CreateApplicationBuilder(args);

// Add custom DB config provider after appsettings.json
builder.Configuration.Add(
    new DbConfigSource(
        builder.Configuration.GetConnectionString("Default")!));

// Or as an extension method:
public static class ConfigExtensions
{
    public static IConfigurationBuilder AddDatabaseConfig(
        this IConfigurationBuilder b, string connStr)
        => b.Add(new DbConfigSource(connStr));
}

// Usage:
builder.Configuration.AddDatabaseConfig(connStr);

Azure App Configuration

Azure App Configuration centralizza le impostazioni tra i microservizi con flag delle funzionalità, etichette e gestione delle versioni. Il provider ufficiale si integra come una normale origine di configurazione.

// dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
// dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore

builder.Configuration.AddAzureAppConfiguration(options =>
    options
        .Connect(builder.Configuration["AzureAppConfig:ConnectionString"])
        .Select(KeyFilter.Any)                 // all keys
        .Select(KeyFilter.Any, "Production")   // label override
        .UseFeatureFlags(ff =>
            ff.CacheExpirationInterval = TimeSpan.FromMinutes(5))
        .ConfigureRefresh(r =>
            r.Register("App:Version", refreshAll: true)
             .SetCacheExpiration(TimeSpan.FromMinutes(1)))
);

app.UseAzureAppConfiguration(); // enable dynamic refresh

Ricaricamento della configurazione

Alcuni provider supportano il rilevamento delle modifiche. Il provider JSON può ricaricare la configurazione quando il file cambia. Utilizzi IOptionsMonitor<T> per reagire alle modifiche durante l'esecuzione.

// Enable JSON file reload on change:
builder.Configuration.AddJsonFile("appsettings.json",
    optional: false, reloadOnChange: true);

// In a service, use IOptionsMonitor (not IOptions) to get live values:
public class FeatureService
{
    private readonly IOptionsMonitor<FeatureFlags> _monitor;

    public FeatureService(IOptionsMonitor<FeatureFlags> m) => _monitor = m;

    public bool IsBetaEnabled
        => _monitor.CurrentValue.BetaEnabled; // always fresh

    // React to changes:
    public FeatureService(IOptionsMonitor<FeatureFlags> m)
    {
        _monitor = m;
        m.OnChange(flags => Console.WriteLine("Config changed!"));
    }
}

Verifica rapida

Quale delimitatore dovrebbe utilizzare per rappresentare le chiavi di configurazione JSON annidate come variabili d'ambiente?

Caso reale: configurazione da più origini

Una configurazione di produzione che combina appsettings, variabili d'ambiente e User Secrets con un ordinamento esplicito delle priorità.

var builder = Host.CreateApplicationBuilder(args);

// Default: appsettings.json → appsettings.{env}.json → env vars → CLI
// Add user secrets in development:
if (builder.Environment.IsDevelopment())
    builder.Configuration.AddUserSecrets<Program>();

// Optionally add Azure Key Vault in production:
if (!builder.Environment.IsDevelopment())
{
    var keyVaultUri = builder.Configuration["Azure:KeyVaultUri"]!;
    builder.Configuration.AddAzureKeyVault(
        new Uri(keyVaultUri), new DefaultAzureCredential());
}

// Now all secrets are available transparently via IConfiguration
var jwtKey = builder.Configuration["Jwt:SecretKey"]!;

Riepilogo: origini e provider di configurazione

Concetti chiave:

  • La configurazione viene unita da più origini; le origini successive sovrascrivono quelle precedenti
  • Priorità: argomenti CLI > variabili d'ambiente > appsettings.{env}.json > appsettings.json
  • Utilizzi __ (doppio carattere di sottolineatura) nelle variabili d'ambiente per le chiavi annidate
  • User Secrets mantiene le credenziali di sviluppo fuori dal controllo del codice sorgente
  • Provider personalizzati: implementi IConfigurationSource + IConfigurationProvider
  • Utilizzi reloadOnChange: true + IOptionsMonitor per aggiornamenti della configurazione in tempo reale

Domande Frequenti

La lezione «Fonti e provider di configurazione» è gratuita?

Sì — il testo completo di «Fonti e provider di configurazione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.

Cosa imparerò in «Fonti e provider di configurazione»?

Combini la configurazione proveniente da file JSON, variabili d'ambiente, argomenti della riga di comando e provider personalizzati, assegnando loro una priorità. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Fonti e provider di configurazione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Fonti e provider di configurazione
  2. Opzioni fortemente tipizzate con IOptions
  3. Convalida delle opzioni e opzioni denominate
  4. Gestione dei segreti
← Torna a C# Academy