C# Academy · Lección

Orígenes y proveedores de configuración

Combine la configuración de archivos JSON, variables de entorno, argumentos de línea de comandos y proveedores personalizados con un sistema de prioridades.

Lección 1 de 413 pasos

Orígenes y proveedores de configuración es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

Configuración en .NET

El sistema de configuración de ASP.NET Core lee configuraciones de varias fuentes —archivos JSON, variables de entorno, argumentos de línea de comandos y más— y las combina en un único almacén plano de pares clave-valor, accesible desde cualquier parte de la aplicación.

appsettings.json

appsettings.json es el archivo de configuración predeterminado. Host.CreateApplicationBuilder lo carga automáticamente. Las configuraciones se combinan con las anulaciones específicas del entorno.

// 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;..."
  }
}

Lectura de valores de configuración

Acceda a la configuración mediante IConfiguration. Las claves usan la notación de dos puntos para representar objetos anidados. Se accede a los arreglos mediante su índice.

// 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"];
    }
}

Variables de entorno

Las variables de entorno anulan las configuraciones JSON y son esenciales para los despliegues en contenedores. Los guiones bajos dobles (__) sustituyen los separadores de dos puntos en las claves anidadas.

# 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

Argumentos de línea de comandos

De forma predeterminada, los argumentos de línea de comandos tienen la prioridad más alta. Usan la sintaxis --key=value o --key value, con dos puntos o guiones bajos dobles para representar anidamientos.

# 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 almacena la configuración sensible fuera del directorio del proyecto durante el desarrollo. Nunca se confirma en el control de versiones y anula 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

Proveedores de configuración personalizados

Implemente IConfigurationProvider y IConfigurationSource para cargar la configuración desde cualquier fuente: una base de datos, Consul, Vault, Redis, etc.

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

Registro de un proveedor personalizado

Agregue un origen de configuración personalizado al builder antes de llamar a Build(). Se integra en la misma cadena de prioridades que los proveedores integrados.

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 centraliza las configuraciones entre microservicios mediante indicadores de funcionalidad, etiquetas y control de versiones. El proveedor oficial se integra como un origen de configuración estándar.

// 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

Recarga de la configuración

Algunos proveedores admiten la detección de cambios. El proveedor JSON puede recargar la configuración cuando cambia el archivo. Use IOptionsMonitor<T> para reaccionar a los cambios durante la ejecución.

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

Comprobación rápida

¿Qué delimitador debe usar para representar las claves de configuración JSON anidadas como variables de entorno?

Caso real: configuración de múltiples fuentes

Una configuración de producción que combina appsettings, variables de entorno y User Secrets con un orden de prioridad explícito.

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"]!;

Resumen: fuentes y proveedores de configuración

Conclusiones clave:

  • La configuración se combina desde varias fuentes; las fuentes posteriores anulan las anteriores
  • Prioridad: argumentos de CLI > variables de entorno > appsettings.{env}.json > appsettings.json
  • Use __ (guion bajo doble) en las variables de entorno para las claves anidadas
  • User Secrets mantiene las credenciales de desarrollo fuera del control de versiones
  • Proveedores personalizados: implemente IConfigurationSource + IConfigurationProvider
  • Use reloadOnChange: true + IOptionsMonitor para actualizar la configuración en tiempo real
Gratis para empezar

Aprende C# con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
93
Lecciones
346

Preguntas frecuentes

¿La lección «Orígenes y proveedores de configuración» es gratis?

Sí — el texto completo de «Orígenes y proveedores de configuración» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Orígenes y proveedores de configuración»?

Combine la configuración de archivos JSON, variables de entorno, argumentos de línea de comandos y proveedores personalizados con un sistema de prioridades. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Orígenes y proveedores de configuración»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Orígenes y proveedores de configuración
  2. Options con tipos seguros mediante IOptions
  3. Validación de Options y Options con nombre
  4. Gestión de secretos
← Volver a C# Academy