Źródła i dostawcy konfiguracji
Warstwuj konfigurację z plików JSON, zmiennych środowiskowych, argumentów wiersza poleceń i niestandardowych dostawców, zachowując priorytety.
Źródła i dostawcy konfiguracji to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.
Konfiguracja w .NET
System konfiguracji ASP.NET Core odczytuje ustawienia z wielu źródeł — plików JSON, zmiennych środowiskowych, argumentów wiersza poleceń i innych — a następnie scala je w jeden płaski magazyn par klucz-wartość, dostępny w dowolnym miejscu aplikacji.
appsettings.json
appsettings.json to domyślny plik konfiguracji. Jest ładowany automatycznie przez Host.CreateApplicationBuilder. Ustawienia są scalane z nadpisaniami zależnymi od środowiska.
// 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;..."
}
}Odczytywanie wartości konfiguracji
Uzyskuj dostęp do konfiguracji za pomocą IConfiguration. Klucze zagnieżdżonych obiektów zapisuje się z użyciem dwukropków. Do tablic odwołuje się za pomocą indeksu.
// 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"];
}
}Zmienne środowiskowe
Zmienne środowiskowe nadpisują ustawienia JSON i są niezbędne podczas wdrażania aplikacji w kontenerach. Podwójne podkreślenia (__) zastępują separatory dwukropkowe w kluczach zagnieżdżonych.
# 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.jsonArgumenty wiersza poleceń
Argumenty wiersza poleceń mają domyślnie najwyższy priorytet. Używają składni --key=value lub --key value, a do oznaczania zagnieżdżenia można stosować dwukropki albo podwójne podkreślenia.
# 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.jsonUser Secrets
User Secrets przechowuje poufną konfigurację poza katalogiem projektu podczas programowania. Dane te nigdy nie są zatwierdzane w systemie kontroli wersji i lokalnie nadpisują 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 onlyNiestandardowi dostawcy konfiguracji
Zaimplementuj IConfigurationProvider i IConfigurationSource, aby ładować konfigurację z dowolnego źródła — bazy danych, Consul, Vault, Redis itd.
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);
}Rejestrowanie niestandardowego dostawcy
Dodaj niestandardowe źródło konfiguracji do buildera przed wywołaniem Build(). Zostanie ono włączone do tego samego łańcucha priorytetów co wbudowani dostawcy.
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 centralizuje ustawienia w mikrousługach, oferując flagi funkcji, etykiety i wersjonowanie. Oficjalny dostawca integruje się jako standardowe źródło konfiguracji.
// 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 refreshPonowne ładowanie konfiguracji
Niektórzy dostawcy obsługują wykrywanie zmian. Dostawca JSON może ponownie załadować konfigurację po zmianie pliku. Użyj IOptionsMonitor<T>, aby reagować na zmiany w czasie działania aplikacji.
// 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!"));
}
}Szybkie sprawdzenie
Jakiego separatora należy użyć, aby reprezentować zagnieżdżone klucze konfiguracji JSON jako zmienne środowiskowe?
Praktyczny przykład: konfiguracja z wielu źródeł
Konfiguracja produkcyjna łącząca appsettings, zmienne środowiskowe i User Secrets z jawnym określeniem kolejności priorytetów.
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"]!;Podsumowanie: źródła i dostawcy konfiguracji
Najważniejsze informacje:
- Konfiguracja jest scalana z wielu źródeł; późniejsze źródła nadpisują wcześniejsze
- Priorytet: argumenty CLI > zmienne środowiskowe > appsettings.{env}.json > appsettings.json
- W zmiennych środowiskowych używaj
__(podwójnego podkreślenia) dla kluczy zagnieżdżonych - User Secrets przechowuje dane uwierzytelniające używane podczas programowania poza systemem kontroli wersji
- Niestandardowi dostawcy: zaimplementuj
IConfigurationSource+IConfigurationProvider - Użyj
reloadOnChange: true+IOptionsMonitor, aby uzyskać aktualizacje konfiguracji na żywo
Często zadawane pytania
Czy lekcja „Źródła i dostawcy konfiguracji” jest bezpłatna?
Tak — pełny tekst „Źródła i dostawcy konfiguracji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Źródła i dostawcy konfiguracji”?
Warstwuj konfigurację z plików JSON, zmiennych środowiskowych, argumentów wiersza poleceń i niestandardowych dostawców, zachowując priorytety. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Źródła i dostawcy konfiguracji”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Źródła i dostawcy konfiguracji
- Silnie typowane opcje z IOptions
- Walidacja opcji i opcje nazwane
- Zarządzanie sekretami