Options pattern — strongly typed configuration.
Settings class:
1public class EmailSettings2{3 public string SmtpServer { get; set; }4 public int Port { get; set; }5 public bool UseSsl { get; set; }6}
appsettings.json:
1{2 "EmailSettings": {3 "SmtpServer": "smtp.gmail.com",4 "Port": 587,5 "UseSsl": true6 }7}
Registration:
1builder.Services.Configure<EmailSettings>(2 builder.Configuration.GetSection("EmailSettings"));
Injection:
1public class EmailService2{3 private readonly EmailSettings _settings;45 public EmailService(IOptions<EmailSettings> options)6 {7 _settings = options.Value;8 }9}
Validation:
1builder.Services.AddOptions<EmailSettings>()2 .Bind(builder.Configuration.GetSection("EmailSettings"))3 .ValidateDataAnnotations()4 .ValidateOnStart();
IOptions vs IOptionsSnapshot vs IOptionsMonitor: