break widget related stuff into its own project as the main HB project was just becoming too bloated

This commit is contained in:
TheXamlGuy
2024-01-24 20:50:59 +00:00
parent d1b57d5d16
commit 5e26e97f6b
61 changed files with 178 additions and 95 deletions
+62
View File
@@ -0,0 +1,62 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Reflection;
namespace Hyperbar.Widget;
public class WidgetBuilder<TConfiguration>(TConfiguration configuration) :
IWidgetBuilder<TConfiguration>
where TConfiguration :
WidgetConfiguration,
new()
{
private readonly IHostBuilder hostBuilder = new HostBuilder()
.UseContentRoot(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
Assembly.GetEntryAssembly()?.GetName().Name!), true)
.ConfigureAppConfiguration(config =>
{
config.AddJsonFile("Settings.json", true, true);
})
.ConfigureServices((context, services) =>
{
services.AddScoped<IServiceFactory>(provider =>
new ServiceFactory((type, parameters) =>
ActivatorUtilities.CreateInstance(provider, type, parameters!)));
services.AddHostedService<WidgetService>();
services.AddScoped<IMediator, Mediator>();
services.AddScoped<IDisposer, Disposer>();
services.AddSingleton<IValue<WidgetAvailability>,
Value<WidgetAvailability>>();
services.AddHandler<WidgetConfigurationHandler>();
services.AddConfiguration<WidgetConfiguration>(section: configuration.GetType().Name,
configuration: configuration);
services.AddConfiguration(configuration);
});
public static IWidgetBuilder Configure(Action<TConfiguration> configurationDelegate)
{
TConfiguration configuration = new();
configurationDelegate(configuration);
return new WidgetBuilder<TConfiguration>(configuration);
}
public IWidgetHost Build()
{
IHost host = hostBuilder.Build();
return (IWidgetHost)ActivatorUtilities.CreateInstance(host.Services,
typeof(WidgetHost), host);
}
public IWidgetBuilder ConfigureServices(Action<IServiceCollection> configureDelegate)
{
hostBuilder.ConfigureServices(configureDelegate.Invoke);
return this;
}
}