get initial extension plugin configuration working from dyamaic dll loading

This commit is contained in:
TheXamlGuy
2024-01-21 21:31:29 +00:00
parent c07eafc9cf
commit 688d7ba063
12 changed files with 84 additions and 46 deletions
@@ -1,10 +1,12 @@
using Hyperbar.Widgets;
namespace Hyperbar.Widget.Contextual; namespace Hyperbar.Widget.Contextual;
public class ContextualWidget : public class ContextualWidget :
IWidget IWidget
{ {
public IWidgetBuilder Create() => public IWidgetBuilder Create() =>
WidgetBuilder.Configure<ContextualWidgetConfiguration>(args => WidgetBuilder<ContextualWidgetConfiguration>.Configure(args =>
{ {
args.Id = Guid.Parse("d3030852-8d4a-4fbb-9aa5-96dff3dfa06c"); args.Id = Guid.Parse("d3030852-8d4a-4fbb-9aa5-96dff3dfa06c");
args.Name = "Contextual commands"; args.Name = "Contextual commands";
@@ -1,3 +1,4 @@
using Hyperbar.Widgets;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Windows.Media.Control; using Windows.Media.Control;
@@ -7,7 +8,7 @@ public class MediaControllerWidget :
IWidget IWidget
{ {
public IWidgetBuilder Create() => public IWidgetBuilder Create() =>
WidgetBuilder.Configure<MediaControllerWidgetConfiguration>(args => WidgetBuilder<MediaControllerWidgetConfiguration>.Configure(args =>
{ {
args.Id = Guid.Parse("1667a800-ec5a-4d39-aa75-4f5ee95bb9f1"); args.Id = Guid.Parse("1667a800-ec5a-4d39-aa75-4f5ee95bb9f1");
args.Name = "Media controller"; args.Name = "Media controller";
+2 -1
View File
@@ -1,3 +1,4 @@
using Hyperbar.Widgets;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Hyperbar.Windows.Primary; namespace Hyperbar.Windows.Primary;
@@ -6,7 +7,7 @@ public class PrimaryWidget :
IWidget IWidget
{ {
public IWidgetBuilder Create() => public IWidgetBuilder Create() =>
WidgetBuilder.Configure<PrimaryWidgetConfiguration>(args => WidgetBuilder<PrimaryWidgetConfiguration>.Configure(args =>
{ {
args.Id = Guid.Parse("cfdfe07c-d9d6-4174-ae41-988ca24d2e10"); args.Id = Guid.Parse("cfdfe07c-d9d6-4174-ae41-988ca24d2e10");
args.Name = "Primary commands"; args.Name = "Primary commands";
+2 -1
View File
@@ -35,7 +35,6 @@ public partial class App :
services.AddSingleton<IDispatcher, Dispatcher>(); services.AddSingleton<IDispatcher, Dispatcher>();
services.AddTransient<ITemplateFactory, TemplateFactory>(); services.AddTransient<ITemplateFactory, TemplateFactory>();
services.AddTransient<IInitializer, AppInitializer>();
services.AddHandler<AppConfigurationChangedHandler>(); services.AddHandler<AppConfigurationChangedHandler>();
services.AddConfiguration<AppConfiguration>(args => services.AddConfiguration<AppConfiguration>(args =>
@@ -43,6 +42,8 @@ public partial class App :
args.Placement = DesktopBarPlacemenet.Top; args.Placement = DesktopBarPlacemenet.Top;
}); });
services.AddTransient<IInitializer, AppInitializer>();
services.AddSingleton<DesktopBar>(); services.AddSingleton<DesktopBar>();
services.AddContentTemplate<WidgetBarViewModel, WidgetBarView>(); services.AddContentTemplate<WidgetBarViewModel, WidgetBarView>();
@@ -1,13 +1,23 @@
namespace Hyperbar; namespace Hyperbar;
public class ConfigurationInitializer<TConfiguration>(IConfigurationReader<TConfiguration> reader) : public class ConfigurationInitializer<TConfiguration>(IConfigurationReader<TConfiguration> reader,
IConfigurationWriter<TConfiguration> writer,
IConfigurationFactory<TConfiguration> factory) :
IConfigurationInitializer<TConfiguration>,
IInitializer IInitializer
where TConfiguration : where TConfiguration :
class class
{ {
public Task InitializeAsync() public Task InitializeAsync()
{ {
reader.Read(); if (!reader.TryRead(out TConfiguration? _))
{
if (factory.Create() is TConfiguration configuration)
{
writer.Write(configuration);
}
}
return Task.CompletedTask; return Task.CompletedTask;
} }
} }
@@ -8,9 +8,12 @@ public class ConfigurationReader<TConfiguration>(IConfigurationSource<TConfigura
{ {
public TConfiguration Read() public TConfiguration Read()
{ {
if ((source.TryGet(out TConfiguration? value) ? value : factory.Create()) is TConfiguration configuration) if (source.TryGet(out TConfiguration? value))
{ {
return configuration; if (value is TConfiguration configuration)
{
return configuration;
}
} }
return factory.Create(); return factory.Create();
@@ -1,15 +1,13 @@
namespace Hyperbar; namespace Hyperbar;
public class ConfigurationWriter<TConfiguration>(IConfigurationSource<TConfiguration> source, public class ConfigurationWriter<TConfiguration>(IConfigurationSource<TConfiguration> source) :
IConfigurationFactory<TConfiguration> factory) :
IConfigurationWriter<TConfiguration> IConfigurationWriter<TConfiguration>
where TConfiguration : where TConfiguration :
class class
{ {
public void Write(Action<TConfiguration> updateDelegate) public void Write(Action<TConfiguration> updateDelegate)
{ {
if ((source.TryGet(out TConfiguration? value) ? value : if (source.TryGet(out TConfiguration? value) is TConfiguration updatedValue)
factory.Create()) is TConfiguration updatedValue)
{ {
updateDelegate?.Invoke(updatedValue); updateDelegate?.Invoke(updatedValue);
Write(updatedValue); Write(updatedValue);
@@ -0,0 +1,10 @@
namespace Hyperbar
{
public interface IConfigurationInitializer<TConfiguration>
where TConfiguration :
class
{
Task InitializeAsync();
}
}
@@ -62,7 +62,7 @@ public static class IServiceCollectionExtensions
TConfiguration configuration = new(); TConfiguration configuration = new();
configurationDelegate.Invoke(configuration); configurationDelegate.Invoke(configuration);
return services.AddConfiguration<TConfiguration>(typeof(TConfiguration).Name, return services.AddConfiguration(typeof(TConfiguration).Name,
"Settings.json", "Settings.json",
configuration); configuration);
} }
@@ -70,21 +70,21 @@ public static class IServiceCollectionExtensions
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services, public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
TConfiguration configuration) TConfiguration configuration)
where TConfiguration : where TConfiguration :
class => services.AddConfiguration<TConfiguration>(configuration.GetType().Name, class => services.AddConfiguration(configuration.GetType().Name,
"Settings.json", "Settings.json",
configuration); configuration);
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services, public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
object configuration) object configuration)
where TConfiguration : where TConfiguration :
class => services.AddConfiguration<TConfiguration>(configuration.GetType().Name, class => services.AddConfiguration(configuration.GetType().Name,
"Settings.json", "Settings.json",
(TConfiguration?)configuration); (TConfiguration?)configuration);
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services, public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
string section, string section,
string path = "Settings.json", string path = "Settings.json",
object? configuration = null, TConfiguration? configuration = null,
Action<JsonSerializerOptions>? serializerDelegate = null) Action<JsonSerializerOptions>? serializerDelegate = null)
where TConfiguration : where TConfiguration :
class class
@@ -119,18 +119,11 @@ public static class IServiceCollectionExtensions
services.AddSingleton<IConfigurationReader<TConfiguration>, ConfigurationReader<TConfiguration>>(); services.AddSingleton<IConfigurationReader<TConfiguration>, ConfigurationReader<TConfiguration>>();
services.AddSingleton<IConfigurationWriter<TConfiguration>, ConfigurationWriter<TConfiguration>>(); services.AddSingleton<IConfigurationWriter<TConfiguration>, ConfigurationWriter<TConfiguration>>();
if (configuration is not null) services.AddTransient<IConfigurationFactory<TConfiguration>>(provider => new ConfigurationFactory<TConfiguration>(() =>
{ (TConfiguration)(configuration ?? provider.GetRequiredService<TConfiguration>())));
services.AddTransient(typeof(TConfiguration), provider => configuration);
}
services.AddTransient<IConfigurationFactory<TConfiguration>>(provider => new ConfigurationFactory<TConfiguration>(() =>
{
var fo = configuration ?? provider.GetRequiredService<TConfiguration>();
return (TConfiguration)fo;
}));
services.AddTransient<IInitializer, ConfigurationInitializer<TConfiguration>>(); services.AddTransient<IInitializer, ConfigurationInitializer<TConfiguration>>();
services.AddTransient<IConfigurationInitializer<TConfiguration>, ConfigurationInitializer<TConfiguration>>();
services.AddTransient<IWritableConfiguration<TConfiguration>, WritableConfiguration<TConfiguration>>(); services.AddTransient<IWritableConfiguration<TConfiguration>, WritableConfiguration<TConfiguration>>();
+9
View File
@@ -7,4 +7,13 @@ public interface IWidgetBuilder
IWidgetBuilder ConfigureServices(Action<IServiceCollection> configureDelegate); IWidgetBuilder ConfigureServices(Action<IServiceCollection> configureDelegate);
IWidgetHost Build(); IWidgetHost Build();
}
public interface IWidgetBuilder<TConfiguration> :
IWidgetBuilder
where TConfiguration :
WidgetConfiguration,
new()
{
} }
+23 -12
View File
@@ -3,15 +3,18 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using System.Reflection; using System.Reflection;
namespace Hyperbar; namespace Hyperbar.Widgets;
public class WidgetBuilder : public class WidgetBuilder<TConfiguration> :
IWidgetBuilder, IWidgetBuilder<TConfiguration>,
IWidgetServiceBuilder IWidgetServiceBuilder
where TConfiguration :
WidgetConfiguration,
new()
{ {
private readonly IHostBuilder hostBuilder; private readonly IHostBuilder hostBuilder;
public WidgetBuilder(IWidgetConfiguration configuration) public WidgetBuilder(TConfiguration configuration)
{ {
hostBuilder = new HostBuilder() hostBuilder = new HostBuilder()
.UseContentRoot(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), .UseContentRoot(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
@@ -30,24 +33,30 @@ public class WidgetBuilder :
services.AddScoped<IMediator, Mediator>(); services.AddScoped<IMediator, Mediator>();
services.AddScoped<IDisposer, Disposer>(); services.AddScoped<IDisposer, Disposer>();
services.AddConfiguration<IWidgetConfiguration>(configuration); services.AddConfiguration<TConfiguration>(configuration);
}); });
} }
public static IWidgetBuilder Configure<TWidgetConfiguration>(Action<TWidgetConfiguration> configurationDelegate) public static IWidgetBuilder Configure(Action<TConfiguration> configurationDelegate)
where TWidgetConfiguration :
IWidgetConfiguration,
new()
{ {
TWidgetConfiguration configuration = new(); TConfiguration configuration = new();
configurationDelegate(configuration); configurationDelegate(configuration);
return new WidgetBuilder(configuration); return new WidgetBuilder<TConfiguration>(configuration);
} }
public IWidgetHost Build() public IWidgetHost Build()
{ {
IHost host = hostBuilder.Build(); IHost host = hostBuilder.Build();
if (host.Services.GetRequiredService<IConfigurationInitializer<TConfiguration>>()
is IConfigurationInitializer<TConfiguration> configurationInitializer)
{
configurationInitializer.InitializeAsync()
.GetAwaiter()
.GetResult();
}
return new WidgetHost(host); return new WidgetHost(host);
} }
@@ -57,6 +66,8 @@ public class WidgetBuilder :
return this; return this;
} }
public void ConfigureWidgetServices(IWidgetServiceCollection widgetServices) => public void ConfigureWidgetServices(IWidgetServiceCollection widgetServices)
{
hostBuilder.ConfigureServices(services => services.AddRange(widgetServices.Services)); hostBuilder.ConfigureServices(services => services.AddRange(widgetServices.Services));
}
} }
+7 -8
View File
@@ -1,16 +1,15 @@
namespace Hyperbar; namespace Hyperbar;
public interface IWidgetConfiguration //public interface IWidgetConfiguration
{ //{
Guid Id { get; set; } // Guid Id { get; set; }
string? Name { get; set; } // string? Name { get; set; }
string? Description { get; set; } // string? Description { get; set; }
} //}
public abstract class WidgetConfiguration : public abstract class WidgetConfiguration
IWidgetConfiguration
{ {
public Guid Id { get; set; } = Guid.NewGuid(); public Guid Id { get; set; } = Guid.NewGuid();