From a17dca0f2f4162438dd8b172e8ce028019e30c83 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Tue, 9 Jan 2024 22:42:55 +0000 Subject: [PATCH] Refactor... --- .../ContextualWidgetProvider.cs | 1 - .../PrimaryWidgetProvider.cs | 6 +- Hyperbar.Windows/App.xaml.cs | 2 +- .../IServiceCollectionExtensions.cs | 1 + Hyperbar/Configuration/Configuration.cs | 9 +++ .../Configuration/ConfigurationInitializer.cs | 17 ++-- .../Configuration/ConfigurationMonitor.cs | 25 ++++++ Hyperbar/Configuration/ConfigurationReader.cs | 52 +++++++++++++ Hyperbar/Configuration/ConfigurationSource.cs | 12 +++ Hyperbar/Configuration/ConfigurationWriter.cs | 78 +++---------------- Hyperbar/Configuration/IConfiguration.cs | 8 ++ .../Configuration/IConfigurationReader.cs | 8 ++ .../Configuration/IConfigurationSource.cs | 10 +++ .../Configuration/IWritableConfiguration.cs | 12 +-- .../Configuration/WritableConfiguration.cs | 25 +----- .../IServiceCollectionExtensions.cs | 48 ++++++------ Hyperbar/Lifecycles/AppService.cs | 5 +- 17 files changed, 176 insertions(+), 143 deletions(-) create mode 100644 Hyperbar/Configuration/Configuration.cs create mode 100644 Hyperbar/Configuration/ConfigurationMonitor.cs create mode 100644 Hyperbar/Configuration/ConfigurationReader.cs create mode 100644 Hyperbar/Configuration/ConfigurationSource.cs create mode 100644 Hyperbar/Configuration/IConfiguration.cs create mode 100644 Hyperbar/Configuration/IConfigurationReader.cs create mode 100644 Hyperbar/Configuration/IConfigurationSource.cs diff --git a/Hyperbar.Windows.Contextual/ContextualWidgetProvider.cs b/Hyperbar.Windows.Contextual/ContextualWidgetProvider.cs index 1035803..5fdb4ba 100644 --- a/Hyperbar.Windows.Contextual/ContextualWidgetProvider.cs +++ b/Hyperbar.Windows.Contextual/ContextualWidgetProvider.cs @@ -7,6 +7,5 @@ public class ContextualWidgetProvider : IWidgetProvider { public void Create(HostBuilderContext comtext, IServiceCollection services) => services - .AddConfiguration(comtext.Configuration.GetSection(nameof(ContextualWidgetConfiguration))) .AddWidgetTemplate(); } \ No newline at end of file diff --git a/Hyperbar.Windows.Primary/PrimaryWidgetProvider.cs b/Hyperbar.Windows.Primary/PrimaryWidgetProvider.cs index 9e5a342..41d47e2 100644 --- a/Hyperbar.Windows.Primary/PrimaryWidgetProvider.cs +++ b/Hyperbar.Windows.Primary/PrimaryWidgetProvider.cs @@ -8,7 +8,7 @@ public class PrimaryWidgetProvider : { public void Create(HostBuilderContext comtext, IServiceCollection services) => services.AddConfiguration() - .AddHandler() - .AddHandler() - .AddWidgetTemplate(); + .AddHandler() + .AddHandler() + .AddWidgetTemplate(); } \ No newline at end of file diff --git a/Hyperbar.Windows/App.xaml.cs b/Hyperbar.Windows/App.xaml.cs index c973367..74ad81c 100644 --- a/Hyperbar.Windows/App.xaml.cs +++ b/Hyperbar.Windows/App.xaml.cs @@ -46,7 +46,7 @@ public partial class App : services.AddTransient(); services.AddContentTemplate(); - services.AddWidgetProvider(); + // services.AddWidgetProvider(); services.AddWidgetProvider(); services.AddTransient(provider => diff --git a/Hyperbar.Windows/Lifecycles/IServiceCollectionExtensions.cs b/Hyperbar.Windows/Lifecycles/IServiceCollectionExtensions.cs index af0438a..d6e5f63 100644 --- a/Hyperbar.Windows/Lifecycles/IServiceCollectionExtensions.cs +++ b/Hyperbar.Windows/Lifecycles/IServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ using Hyperbar.Windows.Interop; +using Hyperbar.Windows.Primary; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; diff --git a/Hyperbar/Configuration/Configuration.cs b/Hyperbar/Configuration/Configuration.cs new file mode 100644 index 0000000..1d4471b --- /dev/null +++ b/Hyperbar/Configuration/Configuration.cs @@ -0,0 +1,9 @@ +namespace Hyperbar; + +public class Configuration(IConfigurationReader reader) : + IConfiguration + where TConfiguration : + class, new() +{ + public TConfiguration Value => reader.Read(); +} diff --git a/Hyperbar/Configuration/ConfigurationInitializer.cs b/Hyperbar/Configuration/ConfigurationInitializer.cs index 956414a..9bf5e14 100644 --- a/Hyperbar/Configuration/ConfigurationInitializer.cs +++ b/Hyperbar/Configuration/ConfigurationInitializer.cs @@ -1,21 +1,14 @@ -using Microsoft.Extensions.Options; - -namespace Hyperbar; +namespace Hyperbar; public class ConfigurationInitializer(DefaultConfiguration defaults, - IConfigurationWriter writer, - IOptionsMonitor options, - IMediator mediator) : IInitializer + IConfigurationWriter writer) : + IInitializer where TConfiguration : - class, new() + class, + new() { public Task InitializeAsync() { - options.OnChange(async args => - { - await mediator.PublishAsync(new ConfigurationChanged(args)); - }); - if (defaults.Configuration is not null) { writer.Write(defaults.Configuration); diff --git a/Hyperbar/Configuration/ConfigurationMonitor.cs b/Hyperbar/Configuration/ConfigurationMonitor.cs new file mode 100644 index 0000000..2e77dff --- /dev/null +++ b/Hyperbar/Configuration/ConfigurationMonitor.cs @@ -0,0 +1,25 @@ +namespace Hyperbar; + +public class ConfigurationMonitor : IInitializer + where TConfiguration : + class, new() +{ + private readonly FileSystemWatcher watcher; + + public ConfigurationMonitor(IConfigurationReader reader) + { + this.watcher = new FileSystemWatcher(); + } + + public Task InitializeAsync() + { + void ChangedHandler(object sender, + FileSystemEventArgs args) + { + + } + + watcher.Changed += ChangedHandler; + return Task.CompletedTask; + } +} diff --git a/Hyperbar/Configuration/ConfigurationReader.cs b/Hyperbar/Configuration/ConfigurationReader.cs new file mode 100644 index 0000000..eda91be --- /dev/null +++ b/Hyperbar/Configuration/ConfigurationReader.cs @@ -0,0 +1,52 @@ +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Hyperbar; + +public class ConfigurationReader(IConfigurationSource source, + JsonSerializerOptions? serializerOptions = null) : + IConfigurationReader + where TConfiguration : + class, new() +{ + private static readonly Func defaultSerializerOptions = new(() => + { + return new JsonSerializerOptions + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + Converters = + { + new JsonStringEnumConverter() + } + }; + }); + + public TConfiguration Read() + { + if ((TryGet(out TConfiguration? value) ? value : new TConfiguration()) is TConfiguration configuration) + { + return configuration; + } + + return new TConfiguration(); + } + + private bool TryGet(out TConfiguration? value) + { + if (File.Exists(source.Path)) + { + byte[] jsonContent = File.ReadAllBytes(source.Path); + + using JsonDocument jsonDocument = JsonDocument.Parse(jsonContent); + if (jsonDocument.RootElement.TryGetProperty(source.Section, out JsonElement sectionValue)) + { + value = JsonSerializer.Deserialize(sectionValue.ToString(), serializerOptions ?? defaultSerializerOptions()); + return true; + } + } + + value = default; + return false; + } +} diff --git a/Hyperbar/Configuration/ConfigurationSource.cs b/Hyperbar/Configuration/ConfigurationSource.cs new file mode 100644 index 0000000..642bc46 --- /dev/null +++ b/Hyperbar/Configuration/ConfigurationSource.cs @@ -0,0 +1,12 @@ +namespace Hyperbar; + +public class ConfigurationSource(string path, + string section) : + IConfigurationSource + where TConfiguration : + class +{ + public string Path => path; + + public string Section => section; +} \ No newline at end of file diff --git a/Hyperbar/Configuration/ConfigurationWriter.cs b/Hyperbar/Configuration/ConfigurationWriter.cs index c6c88a8..3fbc16a 100644 --- a/Hyperbar/Configuration/ConfigurationWriter.cs +++ b/Hyperbar/Configuration/ConfigurationWriter.cs @@ -4,63 +4,7 @@ using System.Text.Json.Serialization; namespace Hyperbar; -public interface IConfigurationReader - where TConfiguration : - class, new() -{ - TConfiguration Read(); -} - -public class ConfigurationReader(string path, - string section, - JsonSerializerOptions? serializerOptions = null) : - IConfigurationReader - where TConfiguration : - class, new() -{ - private static readonly Func defaultSerializerOptions = new(() => - { - return new JsonSerializerOptions - { - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, - Converters = - { - new JsonStringEnumConverter() - } - }; - }); - - public TConfiguration Read() - { - if ((TryGet(out TConfiguration? value) ? value : new TConfiguration()) is TConfiguration configuration) - { - return configuration; - } - - return new TConfiguration(); - } - - private bool TryGet(out TConfiguration? value) - { - if (File.Exists(path)) - { - byte[] jsonContent = File.ReadAllBytes(path); - - using JsonDocument jsonDocument = JsonDocument.Parse(jsonContent); - if (jsonDocument.RootElement.TryGetProperty(section, out JsonElement sectionValue)) - { - value = JsonSerializer.Deserialize(sectionValue.ToString(), serializerOptions ?? defaultSerializerOptions()); - return true; - } - } - - value = default; - return false; - } -} - - public class ConfigurationWriter(string path, - string section, +public class ConfigurationWriter(IConfigurationSource source, JsonSerializerOptions? serializerOptions = null) : IConfigurationWriter where TConfiguration : @@ -87,21 +31,21 @@ public class ConfigurationReader(string path, public void Write(TConfiguration value) { - if (!File.Exists(path)) + if (!File.Exists(source.Path)) { - string? fileDirectoryPath = Path.GetDirectoryName(path); + string? fileDirectoryPath = Path.GetDirectoryName(source.Path); if (!string.IsNullOrEmpty(fileDirectoryPath)) { Directory.CreateDirectory(fileDirectoryPath); } - File.WriteAllText(path, "{}"); + File.WriteAllText(source.Path, "{}"); } - byte[] jsonContent = File.ReadAllBytes(path); + byte[] jsonContent = File.ReadAllBytes(source.Path); using JsonDocument jsonDocument = JsonDocument.Parse(jsonContent); - using FileStream stream = File.OpenWrite(path); + using FileStream stream = File.OpenWrite(source.Path); Utf8JsonWriter writer = new(stream, new JsonWriterOptions() { Indented = true, @@ -114,7 +58,7 @@ public class ConfigurationReader(string path, foreach (JsonProperty element in jsonDocument.RootElement.EnumerateObject()) { - if (element.Name != section) + if (element.Name != source.Section) { element.WriteTo(writer); continue; @@ -126,7 +70,7 @@ public class ConfigurationReader(string path, if (!isWritten) { - writer.WritePropertyName(section); + writer.WritePropertyName(source.Section); optionsElement.WriteTo(writer); } @@ -137,12 +81,12 @@ public class ConfigurationReader(string path, private bool TryGet(out TConfiguration? value) { - if (File.Exists(path)) + if (File.Exists(source.Path)) { - byte[] jsonContent = File.ReadAllBytes(path); + byte[] jsonContent = File.ReadAllBytes(source.Path); using JsonDocument jsonDocument = JsonDocument.Parse(jsonContent); - if (jsonDocument.RootElement.TryGetProperty(section, out JsonElement sectionValue)) + if (jsonDocument.RootElement.TryGetProperty(source.Section, out JsonElement sectionValue)) { value = JsonSerializer.Deserialize(sectionValue.ToString(), serializerOptions ?? defaultSerializerOptions()); return true; diff --git a/Hyperbar/Configuration/IConfiguration.cs b/Hyperbar/Configuration/IConfiguration.cs new file mode 100644 index 0000000..8c8a6cc --- /dev/null +++ b/Hyperbar/Configuration/IConfiguration.cs @@ -0,0 +1,8 @@ +namespace Hyperbar; + +public interface IConfiguration + where TConfiguration : + class, new() +{ + TConfiguration Value { get; } +} diff --git a/Hyperbar/Configuration/IConfigurationReader.cs b/Hyperbar/Configuration/IConfigurationReader.cs new file mode 100644 index 0000000..9441c75 --- /dev/null +++ b/Hyperbar/Configuration/IConfigurationReader.cs @@ -0,0 +1,8 @@ +namespace Hyperbar; + +public interface IConfigurationReader + where TConfiguration : + class, new() +{ + TConfiguration Read(); +} diff --git a/Hyperbar/Configuration/IConfigurationSource.cs b/Hyperbar/Configuration/IConfigurationSource.cs new file mode 100644 index 0000000..42d8946 --- /dev/null +++ b/Hyperbar/Configuration/IConfigurationSource.cs @@ -0,0 +1,10 @@ +namespace Hyperbar; + +public interface IConfigurationSource + where TConfiguration : + class +{ + string Path { get; } + + string Section { get; } +} diff --git a/Hyperbar/Configuration/IWritableConfiguration.cs b/Hyperbar/Configuration/IWritableConfiguration.cs index 26c0446..fce9357 100644 --- a/Hyperbar/Configuration/IWritableConfiguration.cs +++ b/Hyperbar/Configuration/IWritableConfiguration.cs @@ -1,12 +1,8 @@ -using Microsoft.Extensions.Options; +namespace Hyperbar; -namespace Hyperbar; - -public interface IWritableConfiguration : - IOptionsSnapshot +public interface IWritableConfiguration where TConfiguration : class, new() { - void Write(Action updateAction, - bool reload = true); -} \ No newline at end of file + void Write(Action updateDelegate); +} diff --git a/Hyperbar/Configuration/WritableConfiguration.cs b/Hyperbar/Configuration/WritableConfiguration.cs index fb589b2..0dd788a 100644 --- a/Hyperbar/Configuration/WritableConfiguration.cs +++ b/Hyperbar/Configuration/WritableConfiguration.cs @@ -1,26 +1,9 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Options; +namespace Hyperbar; -namespace Hyperbar; - -public class WritableConfiguration(IConfigurationWriter writer, - IOptionsMonitor options, - IConfiguration configuration) : +public class WritableConfiguration(IConfigurationWriter writer) : IWritableConfiguration where TConfiguration : class, new() { - public TConfiguration Value => options.CurrentValue; - - public TConfiguration Get(string? name) => options.Get(name); - - public void Write(Action updateDelegate, - bool reload = true) - { - writer.Write(updateDelegate); - if (reload && configuration is IConfigurationRoot configurationRoot) - { - configurationRoot.Reload(); - } - } -} \ No newline at end of file + public void Write(Action updateDelegate) => writer.Write(updateDelegate); +} diff --git a/Hyperbar/Extensions/IServiceCollectionExtensions.cs b/Hyperbar/Extensions/IServiceCollectionExtensions.cs index 619c3f9..7e320fd 100644 --- a/Hyperbar/Extensions/IServiceCollectionExtensions.cs +++ b/Hyperbar/Extensions/IServiceCollectionExtensions.cs @@ -33,9 +33,7 @@ public static class IServiceCollectionExtensions where TConfiguration : class, new() { - services.AddTransient(provider => provider.GetRequiredService>().Read()); - - services.AddSingleton>(provider => + services.AddSingleton>(provider => { string? jsonFilePath = null; if (provider.GetService() is IHostEnvironment hostEnvironment) @@ -47,30 +45,11 @@ public static class IServiceCollectionExtensions } jsonFilePath ??= Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path); - - JsonSerializerOptions? defaultSerializer = null; - if (serializerDelegate is not null) - { - defaultSerializer = new JsonSerializerOptions(); - serializerDelegate.Invoke(defaultSerializer); - } - - return new ConfigurationReader(jsonFilePath, section, defaultSerializer); + return new ConfigurationSource(jsonFilePath, section); }); - services.AddSingleton>(provider => + services.AddTransient>(provider => { - string? jsonFilePath = null; - if (provider.GetService() is IHostEnvironment hostEnvironment) - { - IFileProvider fileProvider = hostEnvironment.ContentRootFileProvider; - IFileInfo fileInfo = fileProvider.GetFileInfo(path); - - jsonFilePath = fileInfo.PhysicalPath; - } - - jsonFilePath ??= Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path); - JsonSerializerOptions? defaultSerializer = null; if (serializerDelegate is not null) { @@ -78,7 +57,21 @@ public static class IServiceCollectionExtensions serializerDelegate.Invoke(defaultSerializer); } - return new ConfigurationWriter(jsonFilePath, section, defaultSerializer); + return new ConfigurationReader(provider.GetRequiredService>(), + defaultSerializer); + }); + + services.AddTransient>(provider => + { + JsonSerializerOptions? defaultSerializer = null; + if (serializerDelegate is not null) + { + defaultSerializer = new JsonSerializerOptions(); + serializerDelegate.Invoke(defaultSerializer); + } + + return new ConfigurationWriter(provider.GetRequiredService>(), + defaultSerializer); }); services.AddTransient(provider => new DefaultConfiguration(defaults)); @@ -86,6 +79,9 @@ public static class IServiceCollectionExtensions services.AddTransient, WritableConfiguration>(); + services.AddTransient, Configuration>(); + services.AddTransient(provider => provider.GetRequiredService>().Value); + return services; } @@ -109,7 +105,7 @@ public static class IServiceCollectionExtensions } public static IServiceCollection AddHandler(this IServiceCollection services, - ServiceLifetime lifetime = ServiceLifetime.Transient) + ServiceLifetime lifetime = ServiceLifetime.Transient) where THandler : IHandler { diff --git a/Hyperbar/Lifecycles/AppService.cs b/Hyperbar/Lifecycles/AppService.cs index f75dabf..07d318a 100644 --- a/Hyperbar/Lifecycles/AppService.cs +++ b/Hyperbar/Lifecycles/AppService.cs @@ -13,8 +13,5 @@ public class AppService(IEnumerable initializers) : } } - public Task StopAsync(CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } + public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; } \ No newline at end of file