using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace Hyperbar.Widget; public class WidgetHost : INotificationHandler>, IWidgetHost { private readonly IConfigurationInitializer configurationInitializer; private readonly IHost host; private readonly IEnumerable initializers; private readonly IMediator mediator; private readonly IProxyService proxyMediator; public WidgetHost(IHost host, IMediator mediator, IEnumerable initializers, IProxyService proxyMediator, IConfigurationInitializer configurationInitializer) { this.host = host; this.mediator = mediator; this.initializers = initializers; this.proxyMediator = proxyMediator; this.configurationInitializer = configurationInitializer; mediator.Subscribe(this); } public WidgetConfiguration Configuration => host.Services.GetRequiredService(); public IServiceProvider Services => host.Services; public async Task Handle(Changed notification, CancellationToken cancellationToken) { if (notification.Value is WidgetAvailability widgetAvailability) { if (widgetAvailability.Value) { await StartAsync(); } } } public async Task InitializeAsync() => await configurationInitializer.InitializeAsync(); private async Task StartAsync() { if (proxyMediator.Proxy is IMediator mediator) { await mediator.PublishAsync(new Started(this)); } foreach (IInitializer initializer in initializers) { await initializer.InitializeAsync(); } } }