get initial extension plugin configuration working from dyamaic dll loading
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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,10 +8,13 @@ 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))
|
||||
{
|
||||
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>(() =>
|
||||
{
|
||||
var fo = configuration ?? provider.GetRequiredService<TConfiguration>();
|
||||
(TConfiguration)(configuration ?? provider.GetRequiredService<TConfiguration>())));
|
||||
|
||||
return (TConfiguration)fo;
|
||||
}));
|
||||
services.AddTransient<IInitializer, ConfigurationInitializer<TConfiguration>>();
|
||||
services.AddTransient<IConfigurationInitializer<TConfiguration>, ConfigurationInitializer<TConfiguration>>();
|
||||
|
||||
services.AddTransient<IWritableConfiguration<TConfiguration>, WritableConfiguration<TConfiguration>>();
|
||||
|
||||
|
||||
@@ -8,3 +8,12 @@ public interface IWidgetBuilder
|
||||
|
||||
IWidgetHost Build();
|
||||
}
|
||||
|
||||
public interface IWidgetBuilder<TConfiguration> :
|
||||
IWidgetBuilder
|
||||
where TConfiguration :
|
||||
WidgetConfiguration,
|
||||
new()
|
||||
{
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user