Amend configuration to support writing to nested sections

This commit is contained in:
TheXamlGuy
2024-04-21 19:38:38 +01:00
parent 5b055bb2d7
commit e0f49832f8
7 changed files with 135 additions and 132 deletions
@@ -49,6 +49,11 @@ public static class IServiceCollectionExtensions
return services;
}
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
string section)
where TConfiguration : class =>
services.AddConfiguration<TConfiguration>(section, "Settings.json", null);
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services)
where TConfiguration : class =>
services.AddConfiguration<TConfiguration>(typeof(TConfiguration).Name, "Settings.json", null);
@@ -63,6 +68,17 @@ public static class IServiceCollectionExtensions
return services.AddConfiguration(typeof(TConfiguration).Name, "Settings.json", configuration);
}
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
Action<TConfiguration> configurationDelegate,
string section)
where TConfiguration : class, new()
{
TConfiguration configuration = new();
configurationDelegate.Invoke(configuration);
return services.AddConfiguration(section, "Settings.json", configuration);
}
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
TConfiguration configuration)
where TConfiguration : class =>
@@ -81,20 +97,7 @@ public static class IServiceCollectionExtensions
Action<JsonSerializerOptions>? serializerDelegate = null)
where TConfiguration : class
{
services.AddSingleton<IConfigurationSource<TConfiguration>>(provider =>
{
JsonSerializerOptions? defaultSerializer = null;
if (serializerDelegate is not null)
{
defaultSerializer = new JsonSerializerOptions();
serializerDelegate.Invoke(defaultSerializer);
}
return new ConfigurationSource<TConfiguration>(provider.GetRequiredService<IConfigurationFile<TConfiguration>>(),
section, defaultSerializer);
});
services.AddSingleton<IConfigurationFile<TConfiguration>>(provider =>
services.TryAddSingleton<IConfigurationFile<TConfiguration>>(provider =>
{
IFileInfo? fileInfo = null;
if (provider.GetService<IHostEnvironment>() is IHostEnvironment hostEnvironment)
@@ -107,15 +110,39 @@ public static class IServiceCollectionExtensions
return new ConfigurationFile<TConfiguration>(fileInfo);
});
services.AddHostedService<ConfigurationMonitor<TConfiguration>>();
services.AddSingleton<IConfigurationReader<TConfiguration>, ConfigurationReader<TConfiguration>>();
services.AddSingleton<IConfigurationWriter<TConfiguration>, ConfigurationWriter<TConfiguration>>();
services.TryAddKeyedSingleton<IConfigurationSource<TConfiguration>>(section, (provider, KeyAccelerator) =>
{
JsonSerializerOptions? defaultSerializer = null;
if (serializerDelegate is not null)
{
defaultSerializer = new JsonSerializerOptions();
serializerDelegate.Invoke(defaultSerializer);
}
services.AddTransient<IConfigurationFactory<TConfiguration>>(provider => new ConfigurationFactory<TConfiguration>(() =>
configuration ?? provider.GetRequiredService<TConfiguration>()));
return new ConfigurationSource<TConfiguration>(provider.GetRequiredService<IConfigurationFile<TConfiguration>>(),
section, defaultSerializer);
});
services.AddTransient<IInitializer, ConfigurationInitializer<TConfiguration>>();
services.AddTransient<IConfigurationInitializer<TConfiguration>, ConfigurationInitializer<TConfiguration>>();
//services.AddHostedService<ConfigurationMonitor<TConfiguration>>();
services.TryAddKeyedTransient<IConfigurationReader<TConfiguration>>(section, (provider, key) =>
new ConfigurationReader<TConfiguration>(provider.GetRequiredKeyedService<IConfigurationSource<TConfiguration>>(key),
provider.GetRequiredKeyedService<IConfigurationFactory<TConfiguration>>(key)));
services.TryAddKeyedTransient<IConfigurationWriter<TConfiguration>>(section, (provider, key) =>
new ConfigurationWriter<TConfiguration>(provider.GetRequiredKeyedService<IConfigurationSource<TConfiguration>>(key)));
services.TryAddKeyedTransient<IConfigurationFactory<TConfiguration>>(section, (provider, key) =>
new ConfigurationFactory<TConfiguration>(() => configuration ?? provider.GetRequiredService<TConfiguration>()));
services.AddTransient<IInitializer, ConfigurationInitializer<TConfiguration>>(provider =>
new ConfigurationInitializer<TConfiguration>(section,
provider.GetRequiredKeyedService<IConfigurationReader<TConfiguration>>(section),
provider.GetRequiredKeyedService<IConfigurationWriter<TConfiguration>>(section),
provider.GetRequiredKeyedService<IConfigurationFactory<TConfiguration>>(section),
provider.GetRequiredService<IPublisher>()));
services.AddTransient<IConfigurationInitializer<TConfiguration>, ConfigurationInitializer<TConfiguration>>(provider =>
provider.GetRequiredService<IServiceFactory>().Create<ConfigurationInitializer<TConfiguration>>(section));
services.AddTransient<IWritableConfiguration<TConfiguration>, WritableConfiguration<TConfiguration>>();
@@ -125,31 +152,6 @@ public static class IServiceCollectionExtensions
return services;
}
public static IServiceCollection AddTemplate<TViewModel, TView>(this IServiceCollection services,
object? key = null,
params object[]? parameters)
{
Type viewModelType = typeof(TViewModel);
Type viewType = typeof(TView);
key ??= viewModelType.Name.Replace("ViewModel", "");
services.AddTransient(viewModelType, provider =>
provider.GetRequiredService<IServiceFactory>().Create<TViewModel>(parameters)!);
services.AddTransient(viewType);
services.AddKeyedTransient(viewModelType, key, (provider, key) =>
provider.GetRequiredService<IServiceFactory>().Create<TViewModel>(parameters)!);
services.AddKeyedTransient(viewType, key);
services.AddTransient<IContentTemplateDescriptor>(provider =>
new ContentTemplateDescriptor(key, viewModelType, viewType, parameters));
return services;
}
public static IServiceCollection AddHandler<THandler>(this IServiceCollection services,
ServiceLifetime lifetime = ServiceLifetime.Transient)
where THandler : IHandler
@@ -169,7 +171,7 @@ public static class IServiceCollectionExtensions
services.TryAdd(new ServiceDescriptor(typeof(INotificationHandler<>)
.MakeGenericType(notificationType), typeof(THandler), lifetime));
services.Add(new ServiceDescriptor(wrapperType, provider =>
services.Add(new ServiceDescriptor(wrapperType, provider =>
provider.GetService<IServiceFactory>()?.Create(wrapperType,
provider.GetRequiredService(typeof(INotificationHandler<>).MakeGenericType(notificationType)),
provider.GetServices(typeof(IPipelineBehavior<>)
@@ -185,10 +187,10 @@ public static class IServiceCollectionExtensions
Type wrapperType = typeof(HandlerWrapper<,>)
.MakeGenericType(requestType, responseType);
services.TryAdd(new ServiceDescriptor(typeof(THandler),
services.TryAdd(new ServiceDescriptor(typeof(THandler),
typeof(THandler), lifetime));
services.Add(new ServiceDescriptor(wrapperType, provider =>
services.Add(new ServiceDescriptor(wrapperType, provider =>
provider.GetService<IServiceFactory>()?.Create(wrapperType,
provider.GetRequiredService<THandler>(),
provider.GetServices(typeof(IPipelineBehavior<,>)
@@ -203,7 +205,7 @@ public static class IServiceCollectionExtensions
}
public static IServiceCollection AddInitializer<TInitializer>(this IServiceCollection services)
where TInitializer : class,
where TInitializer : class,
IInitializer
{
services.AddTransient<IInitializer, TInitializer>();
@@ -211,7 +213,7 @@ public static class IServiceCollectionExtensions
}
public static IServiceCollection AddNavigateHandler<THandler>(this IServiceCollection services)
where THandler : INavigateHandler,
where THandler : INavigateHandler,
IHandler
{
IEnumerable<Type> contracts = typeof(THandler).GetInterfaces()
@@ -231,6 +233,7 @@ public static class IServiceCollectionExtensions
services.AddHandler<THandler>();
return services;
}
public static IServiceCollection AddRange(this IServiceCollection services,
IServiceCollection fromServices)
{
@@ -241,4 +244,29 @@ public static class IServiceCollectionExtensions
return services;
}
public static IServiceCollection AddTemplate<TViewModel, TView>(this IServiceCollection services,
object? key = null,
params object[]? parameters)
{
Type viewModelType = typeof(TViewModel);
Type viewType = typeof(TView);
key ??= viewModelType.Name.Replace("ViewModel", "");
services.AddTransient(viewModelType, provider =>
provider.GetRequiredService<IServiceFactory>().Create<TViewModel>(parameters)!);
services.AddTransient(viewType);
services.AddKeyedTransient(viewModelType, key, (provider, key) =>
provider.GetRequiredService<IServiceFactory>().Create<TViewModel>(parameters)!);
services.AddKeyedTransient(viewType, key);
services.AddTransient<IContentTemplateDescriptor>(provider =>
new ContentTemplateDescriptor(key, viewModelType, viewType, parameters));
return services;
}
}