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;
public class ContextualWidget :
IWidget
{
public IWidgetBuilder Create() =>
WidgetBuilder.Configure<ContextualWidgetConfiguration>(args =>
WidgetBuilder<ContextualWidgetConfiguration>.Configure(args =>
{
args.Id = Guid.Parse("d3030852-8d4a-4fbb-9aa5-96dff3dfa06c");
args.Name = "Contextual commands";
@@ -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<MediaControllerWidgetConfiguration>(args =>
WidgetBuilder<MediaControllerWidgetConfiguration>.Configure(args =>
{
args.Id = Guid.Parse("1667a800-ec5a-4d39-aa75-4f5ee95bb9f1");
args.Name = "Media controller";
+2 -1
View File
@@ -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<PrimaryWidgetConfiguration>(args =>
WidgetBuilder<PrimaryWidgetConfiguration>.Configure(args =>
{
args.Id = Guid.Parse("cfdfe07c-d9d6-4174-ae41-988ca24d2e10");
args.Name = "Primary commands";
+2 -1
View File
@@ -35,7 +35,6 @@ public partial class App :
services.AddSingleton<IDispatcher, Dispatcher>();
services.AddTransient<ITemplateFactory, TemplateFactory>();
services.AddTransient<IInitializer, AppInitializer>();
services.AddHandler<AppConfigurationChangedHandler>();
services.AddConfiguration<AppConfiguration>(args =>
@@ -43,6 +42,8 @@ public partial class App :
args.Placement = DesktopBarPlacemenet.Top;
});
services.AddTransient<IInitializer, AppInitializer>();
services.AddSingleton<DesktopBar>();
services.AddContentTemplate<WidgetBarViewModel, WidgetBarView>();
@@ -1,13 +1,23 @@
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
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;
}
}
@@ -8,9 +8,12 @@ public class ConfigurationReader<TConfiguration>(IConfigurationSource<TConfigura
{
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();
@@ -1,15 +1,13 @@
namespace Hyperbar;
public class ConfigurationWriter<TConfiguration>(IConfigurationSource<TConfiguration> source,
IConfigurationFactory<TConfiguration> factory) :
public class ConfigurationWriter<TConfiguration>(IConfigurationSource<TConfiguration> source) :
IConfigurationWriter<TConfiguration>
where TConfiguration :
class
{
public void Write(Action<TConfiguration> 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);
@@ -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();
configurationDelegate.Invoke(configuration);
return services.AddConfiguration<TConfiguration>(typeof(TConfiguration).Name,
return services.AddConfiguration(typeof(TConfiguration).Name,
"Settings.json",
configuration);
}
@@ -70,21 +70,21 @@ public static class IServiceCollectionExtensions
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
TConfiguration configuration)
where TConfiguration :
class => services.AddConfiguration<TConfiguration>(configuration.GetType().Name,
class => services.AddConfiguration(configuration.GetType().Name,
"Settings.json",
configuration);
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
object configuration)
where TConfiguration :
class => services.AddConfiguration<TConfiguration>(configuration.GetType().Name,
class => services.AddConfiguration(configuration.GetType().Name,
"Settings.json",
(TConfiguration?)configuration);
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
string section,
string path = "Settings.json",
object? configuration = null,
TConfiguration? configuration = null,
Action<JsonSerializerOptions>? serializerDelegate = null)
where TConfiguration :
class
@@ -119,18 +119,11 @@ public static class IServiceCollectionExtensions
services.AddSingleton<IConfigurationReader<TConfiguration>, ConfigurationReader<TConfiguration>>();
services.AddSingleton<IConfigurationWriter<TConfiguration>, ConfigurationWriter<TConfiguration>>();
if (configuration is not null)
{
services.AddTransient(typeof(TConfiguration), provider => configuration);
}
services.AddTransient<IConfigurationFactory<TConfiguration>>(provider => new ConfigurationFactory<TConfiguration>(() =>
(TConfiguration)(configuration ?? provider.GetRequiredService<TConfiguration>())));
services.AddTransient<IConfigurationFactory<TConfiguration>>(provider => new ConfigurationFactory<TConfiguration>(() =>
{
var fo = configuration ?? provider.GetRequiredService<TConfiguration>();
return (TConfiguration)fo;
}));
services.AddTransient<IInitializer, ConfigurationInitializer<TConfiguration>>();
services.AddTransient<IConfigurationInitializer<TConfiguration>, ConfigurationInitializer<TConfiguration>>();
services.AddTransient<IWritableConfiguration<TConfiguration>, WritableConfiguration<TConfiguration>>();
+9
View File
@@ -7,4 +7,13 @@ public interface IWidgetBuilder
IWidgetBuilder ConfigureServices(Action<IServiceCollection> configureDelegate);
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 System.Reflection;
namespace Hyperbar;
namespace Hyperbar.Widgets;
public class WidgetBuilder :
IWidgetBuilder,
public class WidgetBuilder<TConfiguration> :
IWidgetBuilder<TConfiguration>,
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<IMediator, Mediator>();
services.AddScoped<IDisposer, Disposer>();
services.AddConfiguration<IWidgetConfiguration>(configuration);
services.AddConfiguration<TConfiguration>(configuration);
});
}
public static IWidgetBuilder Configure<TWidgetConfiguration>(Action<TWidgetConfiguration> configurationDelegate)
where TWidgetConfiguration :
IWidgetConfiguration,
new()
public static IWidgetBuilder Configure(Action<TConfiguration> configurationDelegate)
{
TWidgetConfiguration configuration = new();
TConfiguration configuration = new();
configurationDelegate(configuration);
return new WidgetBuilder(configuration);
return new WidgetBuilder<TConfiguration>(configuration);
}
public IWidgetHost Build()
{
IHost host = hostBuilder.Build();
if (host.Services.GetRequiredService<IConfigurationInitializer<TConfiguration>>()
is IConfigurationInitializer<TConfiguration> 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));
}
}
+7 -8
View File
@@ -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();