Convert options validation to use the compile-time source generator, enabling AOT-compatible, reflection-free validation at startup.
When to Use
- •Preparing application for Native AOT compilation
- •Eliminating reflection-based validation overhead
- •Source generation happens at compile time; value validation runs at startup
- •Migrating from
ValidateDataAnnotations()to source-generated validation
Steps
- •
Find options classes with data annotations:
- •Search for classes using
[Required],[Range],[RegularExpression],[MaxLength],[MinLength],[Length] - •These are typically in files matching
*Options.csor*Settings.cs
- •Search for classes using
- •
Check existing validation setup:
- •If class already has a corresponding
[OptionsValidator]partial class, skip it - •Note any existing
ValidateDataAnnotations()calls for removal later
- •If class already has a corresponding
- •
For each options class, create a partial validator class:
csharp[OptionsValidator] public partial class Validate{OptionsClassName} : IValidateOptions<{OptionsClassName}> { }- •Place the validator in the same namespace as the options class
- •The source generator will implement the validation logic at compile time
- •
Register the validator in DI:
csharpservices.AddSingleton<IValidateOptions<MyOptions>, ValidateMyOptions>();
- •Replace any existing
ValidateDataAnnotations()calls - •Ensure
Microsoft.Extensions.Optionsusing directive is present
- •Replace any existing
- •
Verify with build:
bashdotnet build
- •
If build fails, check for:
- •Missing
partialkeyword on validator class - •Unsupported validation attributes
- •Missing package reference to
Microsoft.Extensions.Options
- •Missing
- •
Report results:
- •List all validator classes created
- •List all DI registrations added
- •Confirm build status
Supported Validation Attributes
- •
[Required]- Property must have a value - •
[Range]- Numeric value within specified range - •
[RegularExpression]- String matches regex pattern - •
[MaxLength]- Maximum length for strings/collections - •
[MinLength]- Minimum length for strings/collections - •
[Length]- Exact or range length constraint
Notes
- •Requires .NET 8.0 or higher
- •Requires
Microsoft.Extensions.Optionsversion 8.0 or higher - •
ValidateDataAnnotations()is NOT needed and should be removed - •The
[OptionsValidator]attribute triggers source generation - •Validation runs at startup when options are first resolved
- •Unsupported attributes will produce compiler warnings