From d9affe2f75f539f691ad052f34407154602e1697 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Thu, 2 Apr 2026 19:56:35 -0500 Subject: [PATCH] chore: update sample app to show options pattern usage and verify reload of config works --- .../AppJsonContext.cs | 8 +++ .../Program.cs | 61 +++++++++++++------ ...ensions.Configuration.Secure.Sample.csproj | 2 +- 3 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 src/StevanFreeborn.Extensions.Configuration.Secure.Sample/AppJsonContext.cs diff --git a/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/AppJsonContext.cs b/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/AppJsonContext.cs new file mode 100644 index 0000000..dd63a7a --- /dev/null +++ b/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/AppJsonContext.cs @@ -0,0 +1,8 @@ +using System.Text.Json.Serialization; + +namespace StevanFreeborn.Extensions.Configuration.Secure.Sample; + +[JsonSerializable(typeof(ApiOptions))] +internal partial class AppJsonContext : JsonSerializerContext +{ +} \ No newline at end of file diff --git a/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/Program.cs b/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/Program.cs index 57d8840..e508c0f 100644 --- a/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/Program.cs +++ b/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/Program.cs @@ -1,37 +1,62 @@ -using Microsoft.Extensions.DependencyInjection; +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; -var builder = Host.CreateApplicationBuilder(); - -const string configFileName = "appsettings.json"; -var opts = new JsonStorageOptions() +Action configure = builder => { - FileName = configFileName, + builder + .WithMachineIdKey() + .WithAesCryptoProvider() + .UseJsonFileStorage(new JsonStorageOptions()) + .AddJsonAotContext(AppJsonContext.Default); }; -var storageProvider = new JsonFileStorageProvider(opts); - -builder.Configuration.AddSecureConfig(storageProvider); - -builder.Services.Configure( - builder.Configuration.GetSection(nameof(ApiOptions)) -); - -builder.Services.AddSecureConfig() - .UseJsonFileStorage(opt => opt.FileName = configFileName); +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(); -Console.WriteLine(options.Value); +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 = "apiKey" } + 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}"); diff --git a/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/StevanFreeborn.Extensions.Configuration.Secure.Sample.csproj b/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/StevanFreeborn.Extensions.Configuration.Secure.Sample.csproj index 94ae0dc..76e9b7c 100644 --- a/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/StevanFreeborn.Extensions.Configuration.Secure.Sample.csproj +++ b/src/StevanFreeborn.Extensions.Configuration.Secure.Sample/StevanFreeborn.Extensions.Configuration.Secure.Sample.csproj @@ -2,7 +2,7 @@ Exe - net11.0 + net10.0 enable enable