using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using StevanFreeborn.Extensions.Configuration.Secure; using StevanFreeborn.Extensions.Configuration.Secure.Configuration; using StevanFreeborn.Extensions.Configuration.Secure.Sample; using StevanFreeborn.Extensions.Configuration.Secure.Storage; Action configure = builder => { builder .WithMachineIdKey() .WithAesCryptoProvider() .UseJsonFileStorage(new JsonStorageOptions()) .AddJsonAotContext(AppJsonContext.Default); }; var builder = Host.CreateDefaultBuilder() .ConfigureAppConfiguration((_, b) => { b.AddSecureConfig(configure); }) .ConfigureServices((ctx, s) => { s.Configure(ctx.Configuration.GetSection(nameof(ApiOptions))); s.AddSecureConfig(configure); }); var app = builder.Build(); var options = app.Services.GetRequiredService>(); var optionsMonitor = app.Services.GetRequiredService>(); var secureConfig = app.Services.GetRequiredService(); var scopeFactory = app.Services.GetRequiredService(); var firstScope = scopeFactory.CreateScope(); var firstSnapshot = firstScope.ServiceProvider.GetRequiredService>(); var originalValue = await secureConfig.GetAsync(nameof(ApiOptions)); Console.WriteLine($"Config: {originalValue}"); Console.WriteLine($"IOptions: {options.Value}"); Console.WriteLine($"IOptionsSnapshot 1: {firstSnapshot.Value}"); Console.WriteLine($"IOptionsMonitor: {optionsMonitor.CurrentValue}"); await secureConfig.SetAsync( nameof(ApiOptions), new ApiOptions { ApiKey = Guid.NewGuid().ToString() } ); var config = (IConfigurationRoot)app.Services.GetRequiredService(); config.Reload(); var updatedValue = await secureConfig.GetAsync(nameof(ApiOptions)); var secondScope = scopeFactory.CreateScope(); var secondSnapshot = secondScope.ServiceProvider.GetRequiredService>(); Console.WriteLine($"Config: {updatedValue}"); Console.WriteLine($"IOptions: {options.Value}"); Console.WriteLine($"IOptionsSnapshot 2: {secondSnapshot.Value}"); Console.WriteLine($"IOptionsMonitor: {optionsMonitor.CurrentValue}");