Auf Konfigurations-Änderungen In .NET reagieren

IOptionsMonitor
ist ein leistungsstarkes Werkzeug, das es ermöglicht, Konfigurationsoptionen dynamisch zu überwachen und auf Änderungen zu reagieren.

In diesem Beispiel nehmen wir den Warp-Antrieb der Sternenflotte, der ein paar Jahre nach 2063 in Betrieb genommen werden wird. Ohne jede Frage muss das System darüber informiert werden, falls der Chefingenieur Änderungen an den Betriebsparametern durchgeführt hat.
warpcore.json
{
	"WarpCore":
	{
		"DilithiumFractionRatio": 0.456,
		"MaximumSafeWarpFactor": 9.99656,
		"CanTransWarp": false
	}
}
WarpCoreOptions.cs
public record WarpCoreOptions
{
	public Double DilithiumFractionRatio { get; init; }
	public Double MaximumSafeWarpFactor { get; init; }
	public Boolean CanTransWarp { get; init; }
}

IOptionsMonitor
vom DI-Container anfordern

Statt vom DI-Container
IOptions
zu benutzen, fordert man abweichend
IOptionsMonitor
an. Dieses Interface bietet die Möglichkeit, einen Delegate zu registrieren, sobald sich die Konfigurationsquelle (häufig eine JSON-Datei) ändert.
MarkSixWarpCore.cs
public class MarkSixWarpCore : IWarpCore, IDisposable
{
	private readonly IDisposable? _OptionsChangedListener;

	public MarkSixWarpCore(IOptionsMonitor<WarpCoreOptions> options)
	{
	    _OptionsChangedListener = options.OnChange(OnOptionsChanged);
	    ConfigureWarpCore(options.CurrentValue);
	}

	private void OnOptionsChanged(WarpCoreOptions options)
	{
		ConfigureWarpCore(options);
	}

	private void ConfigureWarpCore(WarpCoreOptions options)
	{
	    SetTransWarpCapability(options.CanTransWarp);
	    ...
	}

	/// <inheritdoc />
	public void Dispose()
	{
		_OptionsChangedListener?.Dispose();
	}
}

Dem
IConfigurationBuilder
die JSON-Datei hinzufügen

Die JSON-Datei wird registriert und dabei mittels
reloadOnChange
angegeben, daß die Datei nach einer Änderung im Dateisystem neu eingelesen werden soll.
Program.cs
private static IHostBuilder CreateHostBuilder(String[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureHostConfiguration(configHost =>
        {
            configHost.AddJsonFile("warpcore.json", reloadOnChange: true);
        });

Ein Kleber, um sie alle aneinander zu kleben

Neben dem Setup der Optionsklasse durch die Klasse
ConfigureOptions
, was ich diesem Artikel genauer beleuchte, muss noch ein
IOptionsChangeTokenSource
registriert werden. Hierzu bietet sich die Implementierung
ConfigurationChangeTokenSource
an, die die sich um die Benachrichtigung kümmert.
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
	services.TryAddEnumerable(
		ServiceDescriptor.Singleton<IConfigureOptions<WarpOptions>, WarpOptionsSetup>());

	services.AddSingleton<IOptionsChangeTokenSource<TOptions>>(serviceProvider =>
	{
		var configuration = serviceProvider.GetRequiredService<IConfiguration>();
		return new ConfigurationChangeTokenSource<TOptions>(name, configuration);
	});
}

Post teilen

In .NET Konfigurationsdaten auslesen

In .NET Konfigurationsdaten auslesen

Automatisches Parsen von Konfigurationsdaten aus JSON in ein DTO mithilfe der Klasse

ConfigureOptions
.