Introduction
ShopNest runs on your laptop, staging, and Azure production — each needs different connection strings and API keys. ASP.NET Core configuration merges JSON files, environment variables, and secrets with a clear priority order.
After this article you will
- Structure appsettings.json and environment-specific files
- Use IOptions, IOptionsSnapshot, IOptionsMonitor
- Store dev secrets in User Secrets — never in Git
- Bind complex configuration objects
- Introduce Azure Key Vault for production
Prerequisites
- Article 24 — Middleware
- ShopNest.Web with EF Core from Module 2
Concept deep-dive
Source priority (later wins)
- appsettings.json
- appsettings.{Environment}.json
- User Secrets (Development only)
- Environment variables
- Command-line args
- Azure Key Vault (if configured)
// appsettings.json
{
"ShopNest": {
"Payment": { "Provider": "Razorpay", "TimeoutSeconds": 30 },
"FeatureFlags": { "NewCheckout": false }
}
}
public class PaymentOptions
{
public const string Section = "ShopNest:Payment";
public string Provider { get; set; } = "";
public int TimeoutSeconds { get; set; }
}
builder.Services.Configure<PaymentOptions>(
builder.Configuration.GetSection(PaymentOptions.Section));
public class CheckoutController : Controller
{
private readonly PaymentOptions _payment;
public CheckoutController(IOptionsSnapshot<PaymentOptions> payment)
=> _payment = payment.Value;
}
| Interface | When |
|---|---|
| IOptions<T> | Singleton snapshot at startup |
| IOptionsSnapshot<T> | Per request, reloads when file changes |
| IOptionsMonitor<T> | Singleton with change callbacks |
User Secrets: dotnet user-secrets set "ShopNest:Payment:ApiKey" "rzp_test_xxx"
Hands-on — ShopNest Multi-Environment Deployment
- Add appsettings.Staging.json with different DB connection.
- Bind PaymentOptions and FeatureFlags classes.
- Toggle NewCheckout flag in checkout view.
- Document Key Vault setup for production (no keys in repo).
Common errors & best practices
- Committing appsettings.Production.json with secrets — use env vars / Key Vault.
- IOptions in Singleton expecting reload — use IOptionsMonitor.
- ASPNETCORE_ENVIRONMENT not set on server — wrong config file loaded.
Interview questions
Q: IOptions vs Snapshot vs Monitor?
A: Snapshot per request with reload; Monitor singleton with OnChange events.
Q: User Secrets purpose?
A: Local dev secrets outside project tree — never committed.
Q: Env var naming?
A: Double underscore for nesting: ShopNest__Payment__ApiKey.
Summary
- Configuration merges multiple sources with defined priority
- Options pattern gives typed, testable settings
- User Secrets + Key Vault keep payment keys out of Git
- Feature flags enable safe rollout per environment
Previous: Middleware
Next: Filters in ASP.NET Core
FAQ
Can I hot-reload appsettings?
IOptionsMonitor/ Snapshot pick up file changes when reloadOnChange is true.
Where set ASPNETCORE_ENVIRONMENT?
launchSettings.json locally; App Service Configuration in Azure.