diff --git a/Hyperbar.Windows.Contextual/ContextualWidget.cs b/Hyperbar.Windows.Contextual/ContextualWidget.cs index b281650..c2db868 100644 --- a/Hyperbar.Windows.Contextual/ContextualWidget.cs +++ b/Hyperbar.Windows.Contextual/ContextualWidget.cs @@ -1,10 +1,12 @@ +using Hyperbar.Widgets; + namespace Hyperbar.Widget.Contextual; public class ContextualWidget : IWidget { public IWidgetBuilder Create() => - WidgetBuilder.Configure(args => + WidgetBuilder.Configure(args => { args.Id = Guid.Parse("d3030852-8d4a-4fbb-9aa5-96dff3dfa06c"); args.Name = "Contextual commands"; diff --git a/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidget.cs b/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidget.cs index 2193dd8..78d8842 100644 --- a/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidget.cs +++ b/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidget.cs @@ -1,3 +1,4 @@ +using Hyperbar.Widgets; using Microsoft.Extensions.DependencyInjection; using Windows.Media.Control; @@ -7,7 +8,7 @@ public class MediaControllerWidget : IWidget { public IWidgetBuilder Create() => - WidgetBuilder.Configure(args => + WidgetBuilder.Configure(args => { args.Id = Guid.Parse("1667a800-ec5a-4d39-aa75-4f5ee95bb9f1"); args.Name = "Media controller"; diff --git a/Hyperbar.Windows.Primary/PrimaryWidget.cs b/Hyperbar.Windows.Primary/PrimaryWidget.cs index 2f06b8c..7f593f2 100644 --- a/Hyperbar.Windows.Primary/PrimaryWidget.cs +++ b/Hyperbar.Windows.Primary/PrimaryWidget.cs @@ -1,3 +1,4 @@ +using Hyperbar.Widgets; using Microsoft.Extensions.DependencyInjection; namespace Hyperbar.Windows.Primary; @@ -6,7 +7,7 @@ public class PrimaryWidget : IWidget { public IWidgetBuilder Create() => - WidgetBuilder.Configure(args => + WidgetBuilder.Configure(args => { args.Id = Guid.Parse("cfdfe07c-d9d6-4174-ae41-988ca24d2e10"); args.Name = "Primary commands"; diff --git a/Hyperbar.Windows/App.xaml.cs b/Hyperbar.Windows/App.xaml.cs index 8e7fda3..44540d3 100644 --- a/Hyperbar.Windows/App.xaml.cs +++ b/Hyperbar.Windows/App.xaml.cs @@ -35,7 +35,6 @@ public partial class App : services.AddSingleton(); services.AddTransient(); - services.AddTransient(); services.AddHandler(); services.AddConfiguration(args => @@ -43,6 +42,8 @@ public partial class App : args.Placement = DesktopBarPlacemenet.Top; }); + services.AddTransient(); + services.AddSingleton(); services.AddContentTemplate(); diff --git a/Hyperbar/Configuration/ConfigurationInitializer.cs b/Hyperbar/Configuration/ConfigurationInitializer.cs index d9cdc45..44a1ba4 100644 --- a/Hyperbar/Configuration/ConfigurationInitializer.cs +++ b/Hyperbar/Configuration/ConfigurationInitializer.cs @@ -1,13 +1,23 @@ namespace Hyperbar; -public class ConfigurationInitializer(IConfigurationReader reader) : +public class ConfigurationInitializer(IConfigurationReader reader, + IConfigurationWriter writer, + IConfigurationFactory factory) : + IConfigurationInitializer, IInitializer where TConfiguration : class { public Task InitializeAsync() { - reader.Read(); + if (!reader.TryRead(out TConfiguration? _)) + { + if (factory.Create() is TConfiguration configuration) + { + writer.Write(configuration); + } + } + return Task.CompletedTask; } } diff --git a/Hyperbar/Configuration/ConfigurationReader.cs b/Hyperbar/Configuration/ConfigurationReader.cs index a7a820c..9296c9f 100644 --- a/Hyperbar/Configuration/ConfigurationReader.cs +++ b/Hyperbar/Configuration/ConfigurationReader.cs @@ -8,9 +8,12 @@ public class ConfigurationReader(IConfigurationSource(IConfigurationSource source, - IConfigurationFactory factory) : +public class ConfigurationWriter(IConfigurationSource source) : IConfigurationWriter where TConfiguration : class { public void Write(Action updateDelegate) { - if ((source.TryGet(out TConfiguration? value) ? value : - factory.Create()) is TConfiguration updatedValue) + if (source.TryGet(out TConfiguration? value) is TConfiguration updatedValue) { updateDelegate?.Invoke(updatedValue); Write(updatedValue); diff --git a/Hyperbar/Configuration/IConfigurationInitializer.cs b/Hyperbar/Configuration/IConfigurationInitializer.cs new file mode 100644 index 0000000..2bbd722 --- /dev/null +++ b/Hyperbar/Configuration/IConfigurationInitializer.cs @@ -0,0 +1,10 @@ + +namespace Hyperbar +{ + public interface IConfigurationInitializer + where TConfiguration : + class + { + Task InitializeAsync(); + } +} \ No newline at end of file diff --git a/Hyperbar/Extensions/IServiceCollectionExtensions.cs b/Hyperbar/Extensions/IServiceCollectionExtensions.cs index 9feeb8a..ec9f663 100644 --- a/Hyperbar/Extensions/IServiceCollectionExtensions.cs +++ b/Hyperbar/Extensions/IServiceCollectionExtensions.cs @@ -62,7 +62,7 @@ public static class IServiceCollectionExtensions TConfiguration configuration = new(); configurationDelegate.Invoke(configuration); - return services.AddConfiguration(typeof(TConfiguration).Name, + return services.AddConfiguration(typeof(TConfiguration).Name, "Settings.json", configuration); } @@ -70,21 +70,21 @@ public static class IServiceCollectionExtensions public static IServiceCollection AddConfiguration(this IServiceCollection services, TConfiguration configuration) where TConfiguration : - class => services.AddConfiguration(configuration.GetType().Name, + class => services.AddConfiguration(configuration.GetType().Name, "Settings.json", configuration); public static IServiceCollection AddConfiguration(this IServiceCollection services, object configuration) where TConfiguration : - class => services.AddConfiguration(configuration.GetType().Name, + class => services.AddConfiguration(configuration.GetType().Name, "Settings.json", (TConfiguration?)configuration); public static IServiceCollection AddConfiguration(this IServiceCollection services, string section, string path = "Settings.json", - object? configuration = null, + TConfiguration? configuration = null, Action? serializerDelegate = null) where TConfiguration : class @@ -119,18 +119,11 @@ public static class IServiceCollectionExtensions services.AddSingleton, ConfigurationReader>(); services.AddSingleton, ConfigurationWriter>(); - if (configuration is not null) - { - services.AddTransient(typeof(TConfiguration), provider => configuration); - } + services.AddTransient>(provider => new ConfigurationFactory(() => + (TConfiguration)(configuration ?? provider.GetRequiredService()))); - services.AddTransient>(provider => new ConfigurationFactory(() => - { - var fo = configuration ?? provider.GetRequiredService(); - - return (TConfiguration)fo; - })); services.AddTransient>(); + services.AddTransient, ConfigurationInitializer>(); services.AddTransient, WritableConfiguration>(); diff --git a/Hyperbar/Widgets/IWidgetBuilder.cs b/Hyperbar/Widgets/IWidgetBuilder.cs index 96e4701..a017677 100644 --- a/Hyperbar/Widgets/IWidgetBuilder.cs +++ b/Hyperbar/Widgets/IWidgetBuilder.cs @@ -7,4 +7,13 @@ public interface IWidgetBuilder IWidgetBuilder ConfigureServices(Action configureDelegate); IWidgetHost Build(); +} + +public interface IWidgetBuilder : + IWidgetBuilder + where TConfiguration : + WidgetConfiguration, + new() +{ + } \ No newline at end of file diff --git a/Hyperbar/Widgets/WidgetBuilder.cs b/Hyperbar/Widgets/WidgetBuilder.cs index 8e4df68..3b9b8bc 100644 --- a/Hyperbar/Widgets/WidgetBuilder.cs +++ b/Hyperbar/Widgets/WidgetBuilder.cs @@ -3,15 +3,18 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Reflection; -namespace Hyperbar; +namespace Hyperbar.Widgets; -public class WidgetBuilder : - IWidgetBuilder, +public class WidgetBuilder : + IWidgetBuilder, IWidgetServiceBuilder + where TConfiguration : + WidgetConfiguration, + new() { private readonly IHostBuilder hostBuilder; - public WidgetBuilder(IWidgetConfiguration configuration) + public WidgetBuilder(TConfiguration configuration) { hostBuilder = new HostBuilder() .UseContentRoot(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @@ -30,24 +33,30 @@ public class WidgetBuilder : services.AddScoped(); services.AddScoped(); - services.AddConfiguration(configuration); + services.AddConfiguration(configuration); }); } - public static IWidgetBuilder Configure(Action configurationDelegate) - where TWidgetConfiguration : - IWidgetConfiguration, - new() + public static IWidgetBuilder Configure(Action configurationDelegate) { - TWidgetConfiguration configuration = new(); + TConfiguration configuration = new(); configurationDelegate(configuration); - return new WidgetBuilder(configuration); + return new WidgetBuilder(configuration); } public IWidgetHost Build() { IHost host = hostBuilder.Build(); + + if (host.Services.GetRequiredService>() + is IConfigurationInitializer configurationInitializer) + { + configurationInitializer.InitializeAsync() + .GetAwaiter() + .GetResult(); + } + return new WidgetHost(host); } @@ -57,6 +66,8 @@ public class WidgetBuilder : return this; } - public void ConfigureWidgetServices(IWidgetServiceCollection widgetServices) => + public void ConfigureWidgetServices(IWidgetServiceCollection widgetServices) + { hostBuilder.ConfigureServices(services => services.AddRange(widgetServices.Services)); + } } \ No newline at end of file diff --git a/Hyperbar/Widgets/WidgetConfiguration.cs b/Hyperbar/Widgets/WidgetConfiguration.cs index 8de8a8b..200d88d 100644 --- a/Hyperbar/Widgets/WidgetConfiguration.cs +++ b/Hyperbar/Widgets/WidgetConfiguration.cs @@ -1,16 +1,15 @@ namespace Hyperbar; -public interface IWidgetConfiguration -{ - Guid Id { get; set; } +//public interface IWidgetConfiguration +//{ +// Guid Id { get; set; } - string? Name { get; set; } +// string? Name { get; set; } - string? Description { get; set; } -} +// string? Description { get; set; } +//} -public abstract class WidgetConfiguration : - IWidgetConfiguration +public abstract class WidgetConfiguration { public Guid Id { get; set; } = Guid.NewGuid();