microsoft-extensions-configuration
Microsoft.Extensions.Options patterns including IValidateOptions, strongly-typed settings, validation on startup, and the Options pattern for clean configuration management.
By aaronontheweb · 511 installs
npx skills add aaronontheweb/dotnet-skills --skill microsoft-extensions-configuration
Source repository · Upstream listing
Microsoft.Extensions Configuration Patterns
When to Use This Skill
Use this skill when:
Binding configuration from appsettings.json to strongly typed classes
Validating configuration at application startup (fail fast)
Implementing complex validation logic for settings
Designing configuration classes that are testable and maintainable
Understanding IOptions<T , IOptionsSnapshot<T , and IOptionsMonitor<T
Reference Files
[advanced patterns.md](advanced patterns.md): Validators with dependencies, named options, complete production example (AkkaSettings), and testing validators
Why Configuration Validation Matters
The Problem: Applications often fail at runtime due to misconfiguration missing connection strings, invalid URLs, out of range values. These failures happen deep in business logic, far from where configuration is loaded.
The Solution: Validate configuration at startup. If invalid, fail immediately with a clear error message.
Pattern 1: Basic Options Binding
Define a Settings Class
Bind from Configuration
Consume in Services
Pattern 2: Data Annotations Validation
For simple validation rules, use Data Annotations:
Enable Data Annotations Validation
Key Point: .ValidateOnStart() is critical. Without it, validation only runs when the options are first accessed.
Pattern 3: IValidateOptions<T for Complex Validation
Data Annotations work for simple rules, but complex validation requires IValidateOptions<T :
Scenario Data Annotations IValidateOptions
Required field Yes Yes
Range check Yes Yes
Cross property validation No Yes
Conditional validation No Yes
External service checks No Yes
Dependency injection in validator No Yes
Implementing IValidateOptions
Register the Validator
Order matters: Data Annotations run first, then IValidateOptions validators. All failures are collected together.
See [advanced patterns.md](advanced patterns.md) for validators with dependencies, named options, and a complete production example.
Pattern 4: Options Lifetime
Interface Lifetime Reloads on Change Use Case
IOptions<T Singleton No Static config, read once
IOptionsSnapshot<T Scoped Yes (per request) Web apps needing fresh config
IOptionsMonitor<T Singleton Yes (with callback) Background services, real time updates
IOptionsMonitor for Background Services
Pattern 5: Post Configuration
Modify options after binding but before validation:
Anti Patterns to Avoid
1. Manual Configuration Access
2. Validation in Constructor
3. Forgetting ValidateOnStart
4. Throwing in IValidateOptions
Summary
Principle Implementation
Fail fast .ValidateOnStart()
Strongly typed Bind to POCO classes
Simple validation Data Annotations
Complex validation IValidateOptions<T
Cross property rules IValidateOptions<T
Environment aware Inject IHostEnvironment
Testable Validators are plain classes