IeuanWalker.AppSettings 2.0.0

Prefix Reserved
dotnet add package IeuanWalker.AppSettings --version 2.0.0
                    
NuGet\Install-Package IeuanWalker.AppSettings -Version 2.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="IeuanWalker.AppSettings" Version="2.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="IeuanWalker.AppSettings" Version="2.0.0" />
                    
Directory.Packages.props
<PackageReference Include="IeuanWalker.AppSettings" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add IeuanWalker.AppSettings --version 2.0.0
                    
#r "nuget: IeuanWalker.AppSettings, 2.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package IeuanWalker.AppSettings@2.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=IeuanWalker.AppSettings&version=2.0.0
                    
Install as a Cake Addin
#tool nuget:?package=IeuanWalker.AppSettings&version=2.0.0
                    
Install as a Cake Tool

AppSettings Nuget Nuget License: MIT

Automatically generates the registration code for IOptions and can validate them on startup using DataAnnotations or fluent validation.

How to use it?

  1. Install the NuGet package into your project.
Install-Package IeuanWalker.AppSettings
  1. Inherit the IAppSettings interface onto the class that models your IOptions
public class ConfirmationEmailSettings : IAppSettings
{
	public required string Subject { get; set; }
}
  1. Register the app settings

    Once IAppSettings has been added to a class in your project, several extension methods will automatically be created. The extension method name convention is AddAppSettingsFrom + your assembly name, and the namespace is your assembly name.

    3.1 An extension method for IServiceCollection is created for all project types by default

    builder.Services.AddAppSettingsFromApiProjectNestedClassLibrary(builder.Configuration);
    

    3.2 If your project is a backend/blazor project, then it will also have an extension method for IHostApplicationBuilder, allowing you to easily chain the registration in your progam.cs

    builder.AddAppSettingsFromApiProject();
    

    3.3 If it's a MAUI project, it will also have an extension method for MauiAppBuilder, allowing you to easily chain the registration in your MauiProgam.cs

    builder.AddAppSettingsFromMauiProject();
    

Section name

By default, it maps the IOptions model to the section name based on the name of the model. For example, the following model -

public class ConfirmationEmailSettings : IAppSettings
{
	public required string Subject { get; set; }
}

Would automatically map to the following app setting section -

{
  "ConfirmationEmailSettings": {
    "Subject": "Test subject"
  }
}

If your model name and configuration section don't match or you want to bind a nested configuration, you can override this within your model by using the SectionName attribute

[SectionName("ConfirmationEmail")]
public class ConfirmationEmailSettings : IAppSettings
{
    public required string Subject { get; set; }
}
[SectionName("NestedConfiguration:ConfirmationEmail")]
public class ConfirmationEmailSettings : IAppSettings
{
    public required string Subject { get; set; }
}

Validation

You can perform validation on startup using DataAnnotations or FluentValidation.

DataAnnotation

All you need to do is add a DataAnnotation attribute onto any property

public class ConfirmationEmailSettings : IAppSettings<ConfirmationEmailSettingsValidator>
{
	[MinLength(5)]
	public required string Subject { get; set; }
}

FluentValidation

To use FluentValidation you need to create an AbstractValidator for your app settings model and add that validator to the IAppSettings inheritance.

public class ConfirmationEmailSettings : IAppSettings<ConfirmationEmailSettingsValidator>
{
	public required string Subject { get; set; }
}

sealed class ConfirmationEmailSettingsValidator : AbstractValidator<ConfirmationEmailSettings>
{
	public ConfirmationEmailSettingsValidator()
	{
		RuleFor(x => x.Subject)
			.NotEmpty()
			.MinimumLength(5);
	}
}

Use FluentValidation without the source generator

You can use FluentValidation without the source generator by not inheriting from IAppSettings and using the extension method

public class ConfirmationEmailSettings
{
	public required string Subject { get; set; }
}

sealed class ConfirmationEmailSettingsValidator : AbstractValidator<ConfirmationEmailSettings>
{
	public ConfirmationEmailSettingsValidator()
	{
		RuleFor(x => x.Subject)
			.NotEmpty()
			.MinimumLength(5);
	}
}

In your startup -

services.AddScoped<IValidator<ConfirmationEmailSettings>, ConfirmationEmailSettingsValidator>();
services.AddOptions<ConfirmationEmailSettings>()
    .Configure(options => configuration.GetSection("FluentValidationWithValidationButNoSectionNameSettings").Bind(options))
    .ValidateFluentValidation()
    .ValidateOnStart();

What does the error look like?

If something fails validation as the application starts up, you will get an exception explaining the exact issue - image

What does the generated code look like?

The generated code is just standard C#/ .NET APIs -

Left is the AppSettings model, Right is the generated code image

Considerations

I do not recommend adding validation to a MAUI project as it can/ will slow startup. To prevent validation, add the DontValidate attribute above your class.

[DontValidate]
public class MobileAppSettings : IAppSettings
{
	public required string Subject { get; set; }
}
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.