MutableOptions 1.0.0

dotnet add package MutableOptions --version 1.0.0                
NuGet\Install-Package MutableOptions -Version 1.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="MutableOptions" Version="1.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add MutableOptions --version 1.0.0                
#r "nuget: MutableOptions, 1.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.
// Install MutableOptions as a Cake Addin
#addin nuget:?package=MutableOptions&version=1.0.0

// Install MutableOptions as a Cake Tool
#tool nuget:?package=MutableOptions&version=1.0.0                

MutableOptions

Extends .NET Options pattern to support writing back to IConfiguration while mutating strongly-typed options.

Usage

Register in dependency injection service container

ConfigureMutable method is provided, that basically can be used instead of Configure for options that needs to support mutations:

services.ConfigureMutable<SimpleOptions>(configurationRoot.GetSection("SimpleOptions"));
Resolve IOptionsMutator<SimpleOptions> to modify the configuration:
IOptionsMutator<SimpleOptions> optionsMutator
optionsMutator.Mutate(options => options with { Bar = 42 });

For convenience in situations when same code have to read and write options there is IMutableOptionsMonitor<TOptions> : IOptionsMonitor<TOptions>, IOptionsMutator<TOptions> interface. Both IOptionsMutator<TOptions> and IMutableOptionsMonitor<TOptions> are registered with singleton lifetime.

Installation

Install NuGet package from Package Manager Console:

PM> Install-Package MutableOptions

Features

  • Compatible with all standartd Options patter interfaces, e.g. IOptions<T>, IOptionsSnapshot<T>, IOptionsMonitor<T>, IConfigureOptions<T> etc.
  • Named options are supported. Specify name parameter to IOptionsMutator.Mutate method to change value of named options.
  • Supports BinderOptions where it could be specified whether it can detect changed in non-public properties and white them to IConfiguration.
  • Can write values of most primitive types properties in flat options types.

NOTE: Complex hierarchical options types, that contain nested classes or collections, is not supported!


Design considerations

IOptionsMutator is a core interface that allows changing configuration by mutating strongly typed options:

public interface IOptionsMutator<TOptions> where TOptions : class
{
    bool Mutate(string? name, Func<TOptions, TOptions> mutator);
}

, where mutator func should return new TOptions instance based on TOptions instance provided, changing the values of some or all properties.

It is recommended to define options types as immutable types, so it would not be possible to change state of TOptions instance directly. The easiest way to achieve that is to use records with init-only properties, e.g.:

public record SimpleOptions
{
    public string Foo { get; init; } = string.Empty;
    
    public int Bar { get; init; }
}

Record types also implement IEquatable<T>, which allows to configure mutable options without specifying custom IEqualityComparer<T>. Another usefult capability of record types is that they have support for with expressions to enable non-destructive mutation of records, which can be used to simplify mutator function implementtion.

optionsMutator.Mutate(options => options with { Bar = 42 });
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  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. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos 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.

Version Downloads Last updated
1.0.0 323 5/6/2023
1.0.0-alpha 164 10/23/2022