Configuration Management in Modern DevOps

Configuration in modern .NET is two problems pretending to be one. The first is how the application reads settings — IConfiguration, IOptions<T>, IOptionsSnapshot<T>, IOptionsMonitor<T>, each with different reload semantics and different lifetime expectations. The second is where those settings come from in the first place: a JSON file in the repo, an environment variable injected by the platform, a Key Vault reference resolved at startup, a YAML manifest mounted by Kubernetes. The runtime treats those the same. Operations does not.

The first failure mode worth taking seriously is the conflation of configuration and secrets. A connection string belongs in appsettings.json until the day it contains a password — and then it belongs in Key Vault, Managed Identity, or a Kubernetes secret, with the application reading it through the same IConfiguration surface so business code never knows the difference. Treating both alike is what produces git histories with leaked credentials and rotation scripts nobody runs.

The second is environment-aware layering. appsettings.json, appsettings.{Environment}.json, environment variables, command-line arguments — the order matters, the precedence matters, and most teams discover this in production when a Container Apps secret silently shadows the local debug value. Strongly-typed options bound with validation (ValidateDataAnnotations, ValidateOnStart) turn that class of bug into a startup failure instead of a midnight pager incident.

Then there is the format mess that lives one layer further out. JSON for application config, YAML for the CI pipeline and Kubernetes manifests, TOML for tooling, INI for the one legacy service nobody touches, and CSV for the export accounting still demands. Each format has different parsing rules, different ways to break, and different blast radius when an AI assistant guesses wrong about indentation or implicit conversions. The articles here cover both halves: how to wire configuration cleanly inside .NET, and how to keep the formats around it from leaking complexity into the application layer.

Alphabet Soup: The Format Buffet Nobody Ordered

Format Buffet Nobody Ordered

Developers wanted one format. We got twenty. CSV mangles data, XML drowns in tags, JSON forbids comments, YAML punishes spaces. TOML tried fixing it. TAML went minimal. TOON optimized for AI. CCL brought category theory. Result? Five formats per project, three parsers, and debugging why NO became false. AI can’t save us either. Welcome to format hell.