Configuration extension methods providing enhanced functionality for Microsoft.Extensions.Configuration including required value retrieval with validation.
$ dotnet add package Zircon.ConfigurationConfiguration extension methods providing enhanced functionality for Microsoft.Extensions.Configuration including required value retrieval with validation.
dotnet add package Zircon.Configuration
using Microsoft.Extensions.Configuration;
using Zircon.Configuration;
// Configuration setup
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
// Get required values - throws if missing
string connectionString = configuration.GetRequiredValue("ConnectionStrings:DefaultConnection");
string apiKey = configuration.GetRequiredValue("ExternalApi:ApiKey");
// Access nested configuration sections
var databaseSection = configuration.GetSection("Database");
string host = databaseSection.GetRequiredValue("Host");
string port = databaseSection.GetRequiredValue("Port");
// The error messages will show the full path: "Database:Host" or "Database:Port"
public void ConfigureServices(IServiceCollection services)
{
var connectionString = Configuration.GetRequiredValue("ConnectionStrings:DefaultConnection");
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
var redisConnection = Configuration.GetRequiredValue("Redis:ConnectionString");
services.AddStackExchangeRedisCache(options =>
options.Configuration = redisConnection);
}
public class AppSettings
{
public string DatabaseConnectionString { get; set; }
public string JwtSecret { get; set; }
public string ExternalApiUrl { get; set; }
}
public void ValidateConfiguration(IConfiguration configuration)
{
// These will all throw with clear error messages if missing
var settings = new AppSettings
{
DatabaseConnectionString = configuration.GetRequiredValue("ConnectionStrings:Database"),
JwtSecret = configuration.GetRequiredValue("Jwt:Secret"),
ExternalApiUrl = configuration.GetRequiredValue("ExternalServices:ApiUrl")
};
}
When a required configuration value is missing, GetRequiredValue throws an InvalidOperationException with a descriptive message:
// If "Database:ConnectionString" is missing:
// InvalidOperationException: "Configuration missing value for: Database:ConnectionString"
// If "ApiKey" is missing from root configuration:
// InvalidOperationException: "Configuration missing value for: ApiKey"
public static string GetRequiredValue(this IConfiguration configuration, string name)
Parameters:
configuration: The IConfiguration instance to retrieve the value fromname: The configuration key nameReturns:
string: The configuration valueExceptions:
InvalidOperationException: Thrown when the configuration value is null or missingKey Features:
IConfiguration and IConfigurationSection instances| Method | Missing Value Behavior | Error Message Quality |
|---|---|---|
configuration["key"] | Returns null | No error - silent failure |
configuration.GetValue<string>("key") | Returns null | No error - silent failure |
configuration.GetRequiredValue("key") | Throws exception | Clear error with full path |
GetRequiredValue during application configuration to fail fastIOptions<T> for structured configurationservices.AddDbContext<ApplicationDbContext>(options =>
{
var connectionString = Configuration.GetRequiredValue("ConnectionStrings:DefaultConnection");
options.UseSqlServer(connectionString);
});
services.AddHttpClient("ExternalApi", client =>
{
var baseUrl = Configuration.GetRequiredValue("ExternalServices:BaseUrl");
var apiKey = Configuration.GetRequiredValue("ExternalServices:ApiKey");
client.BaseAddress = new Uri(baseUrl);
client.DefaultRequestHeaders.Add("X-API-Key", apiKey);
});
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
var secretKey = Configuration.GetRequiredValue("Jwt:SecretKey");
var issuer = Configuration.GetRequiredValue("Jwt:Issuer");
options.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)),
ValidIssuer = issuer,
// ... other parameters
};
});
This project is licensed under the MIT License - see the LICENSE file for details.