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;
|
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";
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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>>();
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user