From 6dbe2db5849285c726b890b9393471f758eaa04e Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Wed, 31 Jan 2024 22:33:23 +0000 Subject: [PATCH] Initilize widget setting without starting its host --- ...erManager.cs => MediaControllerService.cs} | 21 +++++--- .../MediaControllerWidget.cs | 2 +- .../IServiceCollectionExtensions.cs | 4 +- .../WidgetResourceInitializer.cs | 2 +- .../WidgetXamlMetadataInitializer.cs | 2 +- .../IServiceCollectionExtensions.cs | 2 +- Hyperbar.Widget/IWidgetHost.cs | 8 +-- Hyperbar.Widget/IWidgetViewModel.cs | 3 +- Hyperbar.Widget/WidgetBuilder.cs | 13 +++-- Hyperbar.Widget/WidgetConfiguration.cs | 8 +-- Hyperbar.Widget/WidgetConfigurationHandler.cs | 2 +- Hyperbar.Widget/WidgetExtensionHandler.cs | 8 +-- Hyperbar.Widget/WidgetExtensionInitializer.cs | 2 +- Hyperbar.Widget/WidgetHost.cs | 51 ++++++++----------- Hyperbar.Widget/WidgetHostHandler.cs | 33 +++++++----- Hyperbar.Widget/WidgetMonitor.cs | 2 +- Hyperbar.Widget/WidgetService.cs | 27 ++++++++++ Hyperbar.Windows/App.xaml.cs | 2 +- Hyperbar.Windows/Lifecycles/AppInitializer.cs | 2 +- .../Configuration/ConfigurationInitializer.cs | 2 +- .../Configuration/IConfigurationMonitor.cs | 2 +- .../IServiceCollectionExtensions.cs | 2 +- Hyperbar/Lifecycles/AppService.cs | 4 +- Hyperbar/Lifecycles/IInitialization.cs | 2 +- Hyperbar/Lifecycles/IInitializer.cs | 2 +- 25 files changed, 125 insertions(+), 83 deletions(-) rename Hyperbar.Widget.MediaController.Windows/{MediaControllerManager.cs => MediaControllerService.cs} (87%) create mode 100644 Hyperbar.Widget/WidgetService.cs diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerManager.cs b/Hyperbar.Widget.MediaController.Windows/MediaControllerService.cs similarity index 87% rename from Hyperbar.Widget.MediaController.Windows/MediaControllerManager.cs rename to Hyperbar.Widget.MediaController.Windows/MediaControllerService.cs index b93d06f..7e1dc70 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaControllerManager.cs +++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerService.cs @@ -1,30 +1,35 @@ -using Windows.Media.Control; +using Microsoft.Extensions.Hosting; +using Windows.Media.Control; namespace Hyperbar.Widget.MediaController.Windows; -public class MediaControllerManager(IMediator mediator, +public class MediaControllerService(IMediator mediator, IFactory factory) : - IInitializer + IHostedService { - private readonly AsyncLock asyncLock = new(); private readonly List> cache = []; private GlobalSystemMediaTransportControlsSessionManager? mediaTransportControlsSessionManager; - public async Task InitializeAsync() + public async Task StartAsync(CancellationToken cancellationToken) { mediaTransportControlsSessionManager = await GlobalSystemMediaTransportControlsSessionManager.RequestAsync(); mediaTransportControlsSessionManager.SessionsChanged += OnSessionsChanged; - - IReadOnlyList sessions = + + IReadOnlyList sessions = mediaTransportControlsSessionManager.GetSessions(); - + foreach (GlobalSystemMediaTransportControlsSession session in sessions) { await InitializeSessionAsync(session); } } + public Task StopAsync(CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } + private async Task InitializeSessionAsync(GlobalSystemMediaTransportControlsSession session) { if (factory.Create(session) is MediaController mediaController) diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidget.cs b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidget.cs index 0e86910..8040444 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidget.cs +++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidget.cs @@ -15,7 +15,7 @@ public class MediaControllerWidget : .UseViewModelTemplate() .ConfigureServices(args => { - args.AddSingleton() + args.AddHostedService() .AddTransient, ServiceScopeFactory>() .AddTransient, ServiceScopeProvider>() .AddCache() diff --git a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs index f072acc..828f3e1 100644 --- a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs +++ b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs @@ -30,8 +30,8 @@ public static class IServiceCollectionExtensions services.AddHandler(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddContentTemplate(); services.AddContentTemplate(); diff --git a/Hyperbar.Widget.Windows/WidgetResourceInitializer.cs b/Hyperbar.Widget.Windows/WidgetResourceInitializer.cs index c9fb0d3..4c39836 100644 --- a/Hyperbar.Widget.Windows/WidgetResourceInitializer.cs +++ b/Hyperbar.Widget.Windows/WidgetResourceInitializer.cs @@ -4,7 +4,7 @@ using Windows.Storage; namespace Hyperbar.Widget.Windows; internal class WidgetResourceInitializer(IWidgetAssembly widgetAssembly) : - IInitializer + IInitialization { public async Task InitializeAsync() { diff --git a/Hyperbar.Widget.Windows/WidgetXamlMetadataInitializer.cs b/Hyperbar.Widget.Windows/WidgetXamlMetadataInitializer.cs index 8869282..7ab2ffd 100644 --- a/Hyperbar.Widget.Windows/WidgetXamlMetadataInitializer.cs +++ b/Hyperbar.Widget.Windows/WidgetXamlMetadataInitializer.cs @@ -4,7 +4,7 @@ namespace Hyperbar.Widget.Windows; public class WidgetXamlMetadataInitializer(IWidgetAssembly widgetAssembly, IList xamlMetadataProviders) : - IInitializer + IInitialization { public Task InitializeAsync() { diff --git a/Hyperbar.Widget/IServiceCollectionExtensions.cs b/Hyperbar.Widget/IServiceCollectionExtensions.cs index 7586a5b..9a971ec 100644 --- a/Hyperbar.Widget/IServiceCollectionExtensions.cs +++ b/Hyperbar.Widget/IServiceCollectionExtensions.cs @@ -7,7 +7,7 @@ public static class IServiceCollectionExtensions { public static IServiceCollection AddWidget(this IServiceCollection services) { - services.AddTransient(); + services.AddTransient(); services.AddTransient, WidgetFactory>(); services.AddHandler(); diff --git a/Hyperbar.Widget/IWidgetHost.cs b/Hyperbar.Widget/IWidgetHost.cs index 8d35a59..d741b1e 100644 --- a/Hyperbar.Widget/IWidgetHost.cs +++ b/Hyperbar.Widget/IWidgetHost.cs @@ -1,9 +1,9 @@ -namespace Hyperbar.Widget; +using Microsoft.Extensions.Hosting; + +namespace Hyperbar.Widget; public interface IWidgetHost : - IInitializer + IHost { WidgetConfiguration Configuration { get; } - - IServiceProvider Services { get; } } diff --git a/Hyperbar.Widget/IWidgetViewModel.cs b/Hyperbar.Widget/IWidgetViewModel.cs index e4f5838..4669ec7 100644 --- a/Hyperbar.Widget/IWidgetViewModel.cs +++ b/Hyperbar.Widget/IWidgetViewModel.cs @@ -1,3 +1,4 @@ namespace Hyperbar.Widget; -public interface IWidgetViewModel : IDisposable; \ No newline at end of file +public interface IWidgetViewModel : + IDisposable; \ No newline at end of file diff --git a/Hyperbar.Widget/WidgetBuilder.cs b/Hyperbar.Widget/WidgetBuilder.cs index 670c456..ce455d0 100644 --- a/Hyperbar.Widget/WidgetBuilder.cs +++ b/Hyperbar.Widget/WidgetBuilder.cs @@ -25,7 +25,7 @@ public class WidgetBuilder : }) .ConfigureServices((context, services) => { - services.AddSingleton(); + services.AddHostedService(); services.AddScoped(provider => new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters!))); @@ -36,10 +36,13 @@ public class WidgetBuilder : } public static IWidgetBuilder Create() => new WidgetBuilder(); + public IWidgetHost Build() { IHost host = hostBuilder.Build(); - return host.Services.GetRequiredService(); + + return (IWidgetHost)ActivatorUtilities.CreateInstance(host.Services, + typeof(WidgetHost), host); } public IWidgetBuilder UseConfiguration(Action configurationDelegate) @@ -60,7 +63,9 @@ public class WidgetBuilder : hostBuilder.ConfigureServices(services => { services.AddHandler(); - services.AddConfiguration(section: configuration.GetType().Name, configuration: configuration); + services.AddConfiguration(section: configuration.GetType().Name, + configuration: configuration); + services.AddConfiguration(configuration); }); @@ -93,7 +98,7 @@ public class WidgetBuilder : } public IWidgetBuilder UseViewModelTemplate() - where TWidgetContent : + where TWidgetContent : IWidgetViewModel { if (viewModelTemplateRegistered) diff --git a/Hyperbar.Widget/WidgetConfiguration.cs b/Hyperbar.Widget/WidgetConfiguration.cs index 8da6a25..118e7d6 100644 --- a/Hyperbar.Widget/WidgetConfiguration.cs +++ b/Hyperbar.Widget/WidgetConfiguration.cs @@ -5,13 +5,13 @@ public class WidgetConfiguration { public string? Description { get; set; } - [JsonInclude] - internal Guid Id { get; set; } = Guid.NewGuid(); - public string? Name { get; set; } [JsonInclude] - internal bool IsAvailable { get; set; } + internal Guid Id { get; set; } = Guid.NewGuid(); + + [JsonInclude] + internal bool Enabled { get; set; } } public class WidgetConfiguration; diff --git a/Hyperbar.Widget/WidgetConfigurationHandler.cs b/Hyperbar.Widget/WidgetConfigurationHandler.cs index 32bfbba..92fadda 100644 --- a/Hyperbar.Widget/WidgetConfigurationHandler.cs +++ b/Hyperbar.Widget/WidgetConfigurationHandler.cs @@ -8,7 +8,7 @@ public class WidgetConfigurationHandler(IValue widgetAvailab { if (notification.Configuration is WidgetConfiguration configuration) { - await widgetAvailability.SetAsync(args => args with { Value = configuration.IsAvailable }); + await widgetAvailability.SetAsync(args => args with { Value = configuration.Enabled }); } } } diff --git a/Hyperbar.Widget/WidgetExtensionHandler.cs b/Hyperbar.Widget/WidgetExtensionHandler.cs index db350a5..cf576ab 100644 --- a/Hyperbar.Widget/WidgetExtensionHandler.cs +++ b/Hyperbar.Widget/WidgetExtensionHandler.cs @@ -2,8 +2,9 @@ namespace Hyperbar.Widget; -public class WidgetExtensionHandler(IProxyServiceCollection typedServices, - IServiceProvider provider) : +public class WidgetExtensionHandler(IServiceProvider provider, + IMediator mediator, + IProxyServiceCollection typedServices) : INotificationHandler> { public async Task Handle(Created notification, @@ -21,7 +22,8 @@ public class WidgetExtensionHandler(IProxyServiceCollection type }); IWidgetHost host = builder.Build(); - await host.InitializeAsync(); + await mediator.PublishAsync(new Created(host), + cancellationToken); } } } diff --git a/Hyperbar.Widget/WidgetExtensionInitializer.cs b/Hyperbar.Widget/WidgetExtensionInitializer.cs index 87954d5..e509c38 100644 --- a/Hyperbar.Widget/WidgetExtensionInitializer.cs +++ b/Hyperbar.Widget/WidgetExtensionInitializer.cs @@ -1,7 +1,7 @@ namespace Hyperbar.Widget; public class WidgetExtensionInitializer(IMediator mediator) : - IInitializer + IInitialization { public async Task InitializeAsync() => await mediator.PublishAsync>(); diff --git a/Hyperbar.Widget/WidgetHost.cs b/Hyperbar.Widget/WidgetHost.cs index 810fad1..05ba230 100644 --- a/Hyperbar.Widget/WidgetHost.cs +++ b/Hyperbar.Widget/WidgetHost.cs @@ -1,59 +1,52 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; namespace Hyperbar.Widget; -public class WidgetHost : - INotificationHandler>, +public sealed class WidgetHost : IWidgetHost { - private readonly IEnumerable initializers; + private readonly IHost host; private readonly IMediator mediator; private readonly IProxyService proxyMediator; - private readonly IServiceProvider services; - public WidgetHost(IServiceProvider services, + public WidgetHost(IHost host, IMediator mediator, - IEnumerable initializers, IProxyService proxyMediator) { - this.services = services; + this.host = host; this.mediator = mediator; - this.initializers = initializers; this.proxyMediator = proxyMediator; mediator.Subscribe(this); } - public WidgetConfiguration Configuration => - services.GetRequiredService(); + public WidgetConfiguration Configuration => + Services.GetRequiredService(); - public IServiceProvider Services => services; + public IServiceProvider Services => host.Services; - public async Task Handle(Changed notification, - CancellationToken cancellationToken) + public void Dispose() { - if (notification.Value is WidgetAvailability widgetAvailability) - { - if (widgetAvailability.Value) - { - await StartAsync(); - } - } + } - public async Task InitializeAsync() + public async Task StartAsync(CancellationToken cancellationToken = default) { - foreach (IInitializer initializer in initializers) - { - await initializer.InitializeAsync(); - } - } + await host.StartAsync(cancellationToken); - private async Task StartAsync() - { if (proxyMediator.Proxy is IMediator mediator) { - await mediator.PublishAsync(new Started(this)); + await mediator.PublishAsync(new Started(this), + cancellationToken); } + + await this.mediator.PublishAsync(new Started(this), + cancellationToken); + } + + public async Task StopAsync(CancellationToken cancellationToken = default) + { + await host.StopAsync(cancellationToken); } } \ No newline at end of file diff --git a/Hyperbar.Widget/WidgetHostHandler.cs b/Hyperbar.Widget/WidgetHostHandler.cs index e8324a7..cc515e4 100644 --- a/Hyperbar.Widget/WidgetHostHandler.cs +++ b/Hyperbar.Widget/WidgetHostHandler.cs @@ -3,25 +3,34 @@ namespace Hyperbar.Widget; public class WidgetHostHandler(IMediator mediator) : - INotificationHandler>, - INotificationHandler> + INotificationHandler> { - public async Task Handle(Started notification, + //public async Task Handle(Started notification, + // CancellationToken cancellationToken) + //{ + // if (notification.Value is IWidgetHost host) + // { + // if (host.Services.GetService() is IWidgetViewModel viewModel) + // { + // await mediator.PublishAsync(new Created(viewModel), + // nameof(WidgetViewModel), cancellationToken); + // } + // } + //} + + public async Task Handle(Created notification, CancellationToken cancellationToken) { if (notification.Value is IWidgetHost host) { - if (host.Services.GetService() is IWidgetViewModel viewModel) + if (host.Services.GetServices() is + IEnumerable initializations) { - await mediator.PublishAsync(new Created(viewModel), - nameof(WidgetViewModel), cancellationToken); + foreach (IInitialization initialization in initializations) + { + await initialization.InitializeAsync(); + } } } } - - public Task Handle(Stopped notification, - CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } } \ No newline at end of file diff --git a/Hyperbar.Widget/WidgetMonitor.cs b/Hyperbar.Widget/WidgetMonitor.cs index 1db1649..31902af 100644 --- a/Hyperbar.Widget/WidgetMonitor.cs +++ b/Hyperbar.Widget/WidgetMonitor.cs @@ -1,7 +1,7 @@ namespace Hyperbar.Widget; public class WidgetMonitor : - IInitializer + IInitialization { public Task InitializeAsync() { diff --git a/Hyperbar.Widget/WidgetService.cs b/Hyperbar.Widget/WidgetService.cs new file mode 100644 index 0000000..c45d899 --- /dev/null +++ b/Hyperbar.Widget/WidgetService.cs @@ -0,0 +1,27 @@ +using Microsoft.Extensions.Hosting; + +namespace Hyperbar.Widget; + +public class WidgetService : + IHostedService +{ + private readonly IEnumerable initializers; + + public WidgetService(IEnumerable initializers) + { + this.initializers = initializers; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + foreach (IInitialization initializer in initializers) + { + await initializer.InitializeAsync(); + } + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} diff --git a/Hyperbar.Windows/App.xaml.cs b/Hyperbar.Windows/App.xaml.cs index f1d04cf..fddd845 100644 --- a/Hyperbar.Windows/App.xaml.cs +++ b/Hyperbar.Windows/App.xaml.cs @@ -46,7 +46,7 @@ public partial class App : args.Placement = DesktopBarPlacemenet.Top; }); - services.AddTransient(); + services.AddTransient(); services.AddSingleton(); }) diff --git a/Hyperbar.Windows/Lifecycles/AppInitializer.cs b/Hyperbar.Windows/Lifecycles/AppInitializer.cs index e8f9a97..2bac5d9 100644 --- a/Hyperbar.Windows/Lifecycles/AppInitializer.cs +++ b/Hyperbar.Windows/Lifecycles/AppInitializer.cs @@ -9,7 +9,7 @@ public class AppInitializer([FromKeyedServices(nameof(WidgetViewModel))] WidgetB [FromKeyedServices(nameof(WidgetViewModel))] WidgetViewModel viewModel, DesktopBar desktopFlyout, AppConfiguration configuration) : - IInitializer + IInitialization { public Task InitializeAsync() { diff --git a/Hyperbar/Configuration/ConfigurationInitializer.cs b/Hyperbar/Configuration/ConfigurationInitializer.cs index 69b224f..03238ce 100644 --- a/Hyperbar/Configuration/ConfigurationInitializer.cs +++ b/Hyperbar/Configuration/ConfigurationInitializer.cs @@ -5,7 +5,7 @@ public class ConfigurationInitializer(IConfigurationMonitor writer, IConfigurationFactory factory) : IConfigurationInitializer, - IInitializer + IInitialization where TConfiguration : class { diff --git a/Hyperbar/Configuration/IConfigurationMonitor.cs b/Hyperbar/Configuration/IConfigurationMonitor.cs index d2fb2f1..8b1e573 100644 --- a/Hyperbar/Configuration/IConfigurationMonitor.cs +++ b/Hyperbar/Configuration/IConfigurationMonitor.cs @@ -2,6 +2,6 @@ namespace Hyperbar; public interface IConfigurationMonitor : - IInitializer + IInitialization where TConfiguration : class; \ No newline at end of file diff --git a/Hyperbar/Extensions/IServiceCollectionExtensions.cs b/Hyperbar/Extensions/IServiceCollectionExtensions.cs index b166143..eaa9236 100644 --- a/Hyperbar/Extensions/IServiceCollectionExtensions.cs +++ b/Hyperbar/Extensions/IServiceCollectionExtensions.cs @@ -103,7 +103,7 @@ public static class IServiceCollectionExtensions services.AddTransient>(provider => new ConfigurationFactory(() => configuration ?? provider.GetRequiredService())); - services.AddTransient>(); + services.AddTransient>(); services.AddTransient, ConfigurationInitializer>(); services.AddTransient, WritableConfiguration>(); diff --git a/Hyperbar/Lifecycles/AppService.cs b/Hyperbar/Lifecycles/AppService.cs index 07d318a..30c75cc 100644 --- a/Hyperbar/Lifecycles/AppService.cs +++ b/Hyperbar/Lifecycles/AppService.cs @@ -2,12 +2,12 @@ namespace Hyperbar; -public class AppService(IEnumerable initializers) : +public class AppService(IEnumerable initializers) : IHostedService { public async Task StartAsync(CancellationToken cancellationToken) { - foreach (IInitializer initializer in initializers) + foreach (IInitialization initializer in initializers) { await initializer.InitializeAsync(); } diff --git a/Hyperbar/Lifecycles/IInitialization.cs b/Hyperbar/Lifecycles/IInitialization.cs index ddb9bc2..e5fb430 100644 --- a/Hyperbar/Lifecycles/IInitialization.cs +++ b/Hyperbar/Lifecycles/IInitialization.cs @@ -2,7 +2,7 @@ namespace Hyperbar; -public interface IInitialization +public interface IInitialization2 { ICommand Initialize { get; } diff --git a/Hyperbar/Lifecycles/IInitializer.cs b/Hyperbar/Lifecycles/IInitializer.cs index a12d1ea..d39880f 100644 --- a/Hyperbar/Lifecycles/IInitializer.cs +++ b/Hyperbar/Lifecycles/IInitializer.cs @@ -1,6 +1,6 @@ namespace Hyperbar; -public interface IInitializer +public interface IInitialization { Task InitializeAsync(); } \ No newline at end of file