RSCG – NotNotAppSettings
RSCG – NotNotAppSettings
name | NotNotAppSettings |
nuget | https://www.nuget.org/packages/NotNot.AppSettings/ |
link | https://github.com/jasonswearingen/NotNot.AppSettings/ |
author | jasonswearingen |
Application Settings to strongly typed classes. Generate also from AppSettings development
This is how you can use NotNotAppSettings .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <InvariantGlobalization>true</InvariantGlobalization> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.1" /> <PackageReference Include="NotNot.AppSettings" Version="1.0.0" OutputItemType="Analyzer" ReferenceOutputAssembly="true" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> </ItemGroup> <ItemGroup> <AdditionalFiles Update="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </AdditionalFiles> </ItemGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> </Project>
The code that you will use is
var builder = WebApplication.CreateBuilder(args); // Add services to the container. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddSingleton<TestAppSettings.AppSettingsGen.IAppSettingsBinder, TestAppSettings.AppSettingsGen.AppSettingsBinder>(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; var appSettings = app.Services.GetRequiredService<TestAppSettings.AppSettingsGen.IAppSettingsBinder>().AppSettings; Console.WriteLine(appSettings.AppName); app.MapGet("/weatherforecast", () => { var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast ( DateOnly.FromDateTime(DateTime.Now.AddDays(index)), Random.Shared.Next(-20, 55), summaries[Random.Shared.Next(summaries.Length)] )) .ToArray(); return forecast; }) .WithName("GetWeatherForecast") .WithOpenApi(); app.Run(); internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) { public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); }
The code that is generated is
/** * This file is generated by the NotNot.AppSettings nuget package. * Do not edit this file directly, instead edit the appsettings.json files and rebuild the project. **/ using System; using System.Runtime.CompilerServices; namespace TestAppSettings.AppSettingsGen; [CompilerGenerated] public partial class AppSettings { public TestAppSettings.AppSettingsGen._AppSettings.Logging? Logging{get; set;} public string? AllowedHosts{get; set;} public string? AppName{get; set;} }
/** * This file is generated by the NotNot.AppSettings nuget package. * Do not edit this file directly, instead edit the appsettings.json files and rebuild the project. **/ using System; using System.Runtime.CompilerServices; namespace TestAppSettings.AppSettingsGen._AppSettings; [CompilerGenerated] public partial class Logging { public TestAppSettings.AppSettingsGen._AppSettings._Logging.LogLevel? LogLevel{get; set;} }
/** * This file is generated by the NotNot.AppSettings nuget package. * Do not edit this file directly, instead edit the appsettings.json files and rebuild the project. **/ using System; using System.Runtime.CompilerServices; namespace TestAppSettings.AppSettingsGen._AppSettings._Logging; [CompilerGenerated] public partial class LogLevel { public string? Default{get; set;} public string? Microsoft_AspNetCore{get; set;} }
/** * This file is generated by the NotNot.AppSettings nuget package. * Do not edit this file directly, instead edit the appsettings.json files and rebuild the project. **/ using Microsoft.Extensions.Configuration; namespace TestAppSettings.AppSettingsGen; /// <summary> /// Strongly typed AppSettings.json, recreated every build. /// <para>You can use this directly, extend it (it's a partial class), /// or get a populated instance of it via the <see cref="AppSettingsBinder"/> DI service</para> /// </summary> public partial class AppSettings { } /// <summary> /// a DI service that contains a strongly-typed copy of your appsettings.json /// <para><strong>DI Usage:</strong></para> /// <para><c>builder.Services.AddSingleton<IAppSettingsBinder, AppSettingsBinder>();</c></para> /// <para><c>var app = builder.Build();</c></para> /// <para><c>var appSettings = app.Services.GetRequiredService<IAppSettingsBinder>().AppSettings;</c></para> /// <para><strong>Non-DI Usage:</strong></para> /// <para><c>var appSettings = AppSettingsBinder.LoadDirect();</c></para> /// </summary> public partial class AppSettingsBinder : IAppSettingsBinder { public AppSettings AppSettings { get; protected set; } public AppSettingsBinder(IConfiguration _config) { AppSettings = new AppSettings(); //automatically reads and binds to config file _config.Bind(AppSettings); } /// <summary> /// Manually construct an AppSettings from your appsettings.json files. /// <para>NOTE: This method is provided for non-DI users. If you use DI, don't use this method. Instead just register this class as a service.</para> /// </summary> /// <param name="appSettingsLocation">folder where to search for appsettings.json. defaults to current app folder.</param> /// <param name="appSettingsFileNames">lets you override the files to load up. defaults to 'appsettings.json' and 'appsettings.{DOTNET_ENVIRONMENT}.json'</param> /// <param name="throwIfFilesMissing">default is to silently ignore if any of the .json files are missing.</param> /// <returns>your strongly typed appsettings with values from your .json loaded in</returns> public static AppSettings LoadDirect(string? appSettingsLocation = null,IEnumerable<string>? appSettingsFileNames=null,bool throwIfFilesMissing=false ) { //pick what .json files to load if (appSettingsFileNames is null) { //figure out what env var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); env ??= Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT"); env ??= Environment.GetEnvironmentVariable("ENVIRONMENT"); //env ??= "Development"; //default to "Development if (env is null) { appSettingsFileNames = new[] { "appsettings.json" }; } else { appSettingsFileNames = new[] { "appsettings.json", $"appsettings.{env}.json" }; } } //build a config from the specified files var builder = new ConfigurationBuilder(); if (appSettingsLocation != null) { builder.SetBasePath(appSettingsLocation); } var optional = !throwIfFilesMissing; foreach (var fileName in appSettingsFileNames) { builder.AddJsonFile(fileName, optional: optional, reloadOnChange: false); // Add appsettings.json } IConfigurationRoot configuration = builder.Build(); //now finally get the appsettings we care about var binder = new AppSettingsBinder(configuration); return binder.AppSettings; } } /// <summary> /// a DI service that contains a strongly-typed copy of your appsettings.json /// <para><strong>DI Usage:</strong></para> /// <para><c>builder.Services.AddSingleton<IAppSettingsBinder, AppSettingsBinder>();</c></para> /// <para><c>var app = builder.Build();</c></para> /// <para><c>var appSettings = app.Services.GetRequiredService<IAppSettingsBinder>().AppSettings;</c></para> /// <para><strong>Non-DI Usage:</strong></para> /// <para><c>var appSettings = AppSettingsBinder.LoadDirect();</c></para> /// </summary> public interface IAppSettingsBinder { public AppSettings AppSettings { get; } }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/NotNotAppSettings
Leave a Reply