diff --git a/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs b/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs index 56ead0d..33f8057 100644 --- a/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs +++ b/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs @@ -1,5 +1,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using Hyperbar.UI.Windows; +using System.Collections.Concurrent; +using System.Threading.Channels; namespace Hyperbar.Widget.Windows; @@ -10,6 +12,7 @@ public partial class WidgetConfigurationViewModel : class { private readonly Func read; + private readonly Func write; [ObservableProperty] private string? description; @@ -23,10 +26,12 @@ public partial class WidgetConfigurationViewModel : IDisposer disposer, ISubscriber subscriber, string? title, - Func read) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) + Func read, + Func write) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) { this.title = title; this.read = read; + this.write = write; } public WidgetConfigurationViewModel(IServiceProvider serviceProvider, @@ -36,12 +41,14 @@ public partial class WidgetConfigurationViewModel : ISubscriber subscriber, string? title, string? description, - Func read) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) + Func read, + Func write) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) { this.title = title; this.description = description; this.read = read; + this.write = write; } public Task Handle(Changed args, @@ -54,6 +61,11 @@ public partial class WidgetConfigurationViewModel : return Task.CompletedTask; } + + protected override void OnChanged(TValue? value) + { + base.OnChanged(value); + } } public class WidgetConfigurationViewModel : diff --git a/Hyperbar.Widget/WidgetBuilder.cs b/Hyperbar.Widget/WidgetBuilder.cs index 6f191b1..2eaf44f 100644 --- a/Hyperbar.Widget/WidgetBuilder.cs +++ b/Hyperbar.Widget/WidgetBuilder.cs @@ -42,7 +42,7 @@ public class WidgetBuilder : services.AddSingleton(); services.AddHandler(); - services.AddConfigurationChanged((config) => (args) => { args.Value = config.IsEnabled; @@ -80,7 +80,7 @@ public class WidgetBuilder : hostBuilder.ConfigureServices(services => { - services.AddHandler(); + // services.AddHandler(); services.AddConfiguration(section: configuration.GetType().Name, configuration: configuration); diff --git a/Hyperbar.Widget/WidgetConfigurationHandler.cs b/Hyperbar.Widget/WidgetConfigurationHandler.cs deleted file mode 100644 index c374131..0000000 --- a/Hyperbar.Widget/WidgetConfigurationHandler.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Hyperbar.Widget; - -public class WidgetConfigurationHandler(IEnumerable> - configurationValueChangedNotifications) : - INotificationHandler> -{ - public async Task Handle(Changed args, - CancellationToken cancellationToken) - { - if (args.Value is WidgetConfiguration configuration) - { - foreach (IConfigurationChangedPublisher notification in - configurationValueChangedNotifications) - { - await notification.PublishAsync(configuration); - } - } - } -} diff --git a/Hyperbar/ConfigurationChangedHandler.cs b/Hyperbar/ConfigurationChangedHandler.cs new file mode 100644 index 0000000..d8eab5b --- /dev/null +++ b/Hyperbar/ConfigurationChangedHandler.cs @@ -0,0 +1,26 @@ +namespace Hyperbar; + +public class UpdateConfigurationHandler : + INotificationHandler> +{ + +} +public class ConfigurationChangedHandler(ConfigurationValue configurationValue) : + INotificationHandler> + where TValue : + class, new() +{ + public Task Handle(Changed args, + CancellationToken cancellationToken = default) + { + if (args.Value is TConfiguration configuration) + { + if (configurationValue.TryUpdate(configuration, out TValue value)) + { + + } + } + + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Hyperbar/ConfigurationChangedPublisher.cs b/Hyperbar/ConfigurationChangedPublisher.cs deleted file mode 100644 index f2b9c66..0000000 --- a/Hyperbar/ConfigurationChangedPublisher.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Hyperbar; - -public class ConfigurationChangedPublisher(IPublisher publisher, - Func> factory) : - IConfigurationChangedPublisher - where TConfiguration : - class - where TValue : - class, new() -{ - private TValue? value; - - public async Task PublishAsync(TConfiguration configuration) - { - TValue newValue = new(); - factory(configuration).Invoke(newValue); - - if (value is null || !value.Equals(newValue)) - { - value = newValue; - await publisher.PublishAsync(new Changed(value)); - } - } -} diff --git a/Hyperbar/ConfigurationValue.cs b/Hyperbar/ConfigurationValue.cs new file mode 100644 index 0000000..e950fbc --- /dev/null +++ b/Hyperbar/ConfigurationValue.cs @@ -0,0 +1,25 @@ +namespace Hyperbar; + +public class ConfigurationValue(Func> changed) + where TValue : + class, new() +{ + private TValue? currentValue; + + public bool TryUpdate(TConfiguration configuration, + out TValue value) + { + TValue newValue = new(); + changed(configuration).Invoke(newValue); + + if (!EqualityComparer.Default.Equals(currentValue, newValue)) + { + value = newValue; + currentValue = newValue; + return true; + } + + value = currentValue!; + return false; + } +} \ No newline at end of file diff --git a/Hyperbar/IConfigurationChanged.cs b/Hyperbar/IConfigurationChanged.cs new file mode 100644 index 0000000..e45f874 --- /dev/null +++ b/Hyperbar/IConfigurationChanged.cs @@ -0,0 +1,4 @@ +namespace Hyperbar; + +public interface IConfigurationChanged : + IInitializer; \ No newline at end of file diff --git a/Hyperbar/IConfigurationChangedPublisher.cs b/Hyperbar/IConfigurationChangedPublisher.cs deleted file mode 100644 index 9701217..0000000 --- a/Hyperbar/IConfigurationChangedPublisher.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Hyperbar; - -public interface IConfigurationChangedPublisher -{ - Task PublishAsync(TConfiguration configuration); -} diff --git a/Hyperbar/IServiceCollectionExtensions.cs b/Hyperbar/IServiceCollectionExtensions.cs index 4cd7c54..59981f7 100644 --- a/Hyperbar/IServiceCollectionExtensions.cs +++ b/Hyperbar/IServiceCollectionExtensions.cs @@ -10,16 +10,16 @@ namespace Hyperbar; public static class IServiceCollectionExtensions { - public static IServiceCollection AddConfigurationChanged(this IServiceCollection services, - Func> factory) + public static IServiceCollection AddConfiguration(this IServiceCollection services, + Func> changed) where TConfiguration : class where TValue : class, new() { - services.AddSingleton>(provider => - new ConfigurationChangedPublisher(provider.GetRequiredService(), - factory)); + services.AddSingleton(new ConfigurationValue(changed)); + services.AddHandler>(); return services; } @@ -214,8 +214,7 @@ public static class IServiceCollectionExtensions contract.GetGenericArguments() is { Length: 1 } notificationArguments) { Type notificationType = notificationArguments[0]; - services.Add(new ServiceDescriptor( - typeof(INotificationHandler<>).MakeGenericType(notificationType), + services.Add(new ServiceDescriptor(typeof(INotificationHandler<>).MakeGenericType(notificationType), typeof(THandler), lifetime)); } @@ -235,7 +234,8 @@ public static class IServiceCollectionExtensions provider.GetService()?.Create( wrapperType, provider.GetRequiredService(), - provider.GetServices(typeof(IPipelineBehavior<,>).MakeGenericType(requestType, responseType)) + provider.GetServices(typeof(IPipelineBehavior<,>) + .MakeGenericType(requestType, responseType)) )!, lifetime )); diff --git a/Hyperbar/ValueViewModel.cs b/Hyperbar/ValueViewModel.cs index a0e7078..9b7c3b4 100644 --- a/Hyperbar/ValueViewModel.cs +++ b/Hyperbar/ValueViewModel.cs @@ -11,4 +11,11 @@ public partial class ValueViewModel(IServiceProvider serviceProvider, { [ObservableProperty] private TValue? value; + + protected virtual void OnChanged(TValue? value) + { + + } + + partial void OnValueChanged(TValue? value) => OnChanged(value); }