MutableOptions 1.0.0
dotnet add package MutableOptions --version 1.0.0
NuGet\Install-Package MutableOptions -Version 1.0.0
<PackageReference Include="MutableOptions" Version="1.0.0" />
paket add MutableOptions --version 1.0.0
#r "nuget: MutableOptions, 1.0.0"
// 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 toIOptionsMutator.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 toIConfiguration
. - 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 | Versions 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. |
-
.NETStandard 2.0
- Microsoft.Extensions.Configuration (>= 6.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 6.0.0)
- Microsoft.Extensions.Options (>= 6.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 6.0.0)
-
net6.0
- Microsoft.Extensions.Configuration (>= 6.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 6.0.0)
- Microsoft.Extensions.Options (>= 6.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 6.0.0)
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 | 317 | 5/6/2023 |
1.0.0-alpha | 161 | 10/23/2022 |