The Options Pattern in NET: Validating Configuration at Startup

Listen to this Post

The Options Pattern in .NET allows developers to use strongly typed configuration objects at runtime. However, a significant issue arises—configuration validity isn’t confirmed until runtime usage. To solve this, we can implement `IValidateOptions` to validate configurations during application startup, ensuring early detection of misconfigurations.

Complete Implementation: https://lnkd.in/ea8mjFFP

You Should Know:

1. Custom `IValidateOptions` Implementation

To validate options at startup, create a validator implementing IValidateOptions<T>:

public class MyOptionsValidator : IValidateOptions<MyOptions> 
{ 
public ValidateOptionsResult Validate(string name, MyOptions options) 
{ 
if (string.IsNullOrEmpty(options.ApiKey)) 
{ 
return ValidateOptionsResult.Fail("API Key is required!"); 
} 
return ValidateOptionsResult.Success; 
} 
} 

Register it in `Program.cs`:

builder.Services.AddSingleton<IValidateOptions<MyOptions>, MyOptionsValidator>(); 

2. Using FluentValidation for Advanced Validation

FluentValidation provides a cleaner way to define validation rules:

public class MyOptionsValidator : AbstractValidator<MyOptions> 
{ 
public MyOptionsValidator() 
{ 
RuleFor(x => x.ApiKey).NotEmpty(); 
RuleFor(x => x.Timeout).GreaterThan(0); 
} 
} 

Register it with:

builder.Services.AddValidatorsFromAssemblyContaining<MyOptionsValidator>(); 
builder.Services.AddSingleton<IValidateOptions<MyOptions>, FluentValidationOptions<MyOptions>>(); 

3. Linux/Windows Commands for Configuration Debugging

  • Check .NET Config Files:
    cat appsettings.json | jq  (Linux, requires <code>jq</code>) 
    
  • Validate Environment Variables:
    printenv | grep "ASPNETCORE_"  Linux 
    
    Get-ChildItem Env: | Where-Object { $_.Name -like "ASPNETCORE" }  Windows 
    

4. Forced Validation at Startup

Ensure validation runs immediately:

var app = builder.Build(); 
var options = app.Services.GetRequiredService<IOptions<MyOptions>>().Value; 

What Undercode Say

Validating configuration early prevents runtime failures. Combining `IValidateOptions` with FluentValidation ensures robustness. For DevOps, always:
– Log Configurations:

dotnet run --environment Development | tee app.log 

– Test in Isolation:

docker run -e "ASPNETCORE_ENV=Staging" myapp 

– Windows Event Logs:

Get-EventLog -LogName Application -Source "DotNet Runtime" -Newest 10 

Expected Output:

A .NET application that fails fast on invalid configs, reducing debugging time in production.

Reference: https://lnkd.in/ea8mjFFP

References:

Reported By: Milan Jovanovic – Hackers Feeds
Extra Hub: Undercode MoN
Basic Verification: Pass ✅

Join Our Cyber World:

💬 Whatsapp | 💬 TelegramFeatured Image