Files
Hyperbar/Hyperbar.Widget/WidgetBuilder.cs
T
TheXamlGuy 4edb0a7eb5 WIP
2024-02-01 22:13:45 +00:00

119 lines
3.5 KiB
C#

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Reflection;
namespace Hyperbar.Widget;
public class WidgetBuilder :
IWidgetBuilder
{
private readonly IHostBuilder hostBuilder;
private bool configurationRegistered;
private bool viewModelTemplateRegistered;
private WidgetBuilder()
{
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.AddSingleton<IWidgetHost, WidgetHost>();
services.AddScoped<IServiceFactory>(provider =>
new ServiceFactory((type, parameters) =>
ActivatorUtilities.CreateInstance(provider, type, parameters!)));
services.AddScoped<IMediator, Mediator>();
services.AddScoped<IDisposer, Disposer>();
services.AddHandler<WidgetAvailabilityChangedHandler>();
services.AddValueChangedNotification<WidgetConfiguration,
WidgetAvailability>((config) => (args) =>
{
args.Value = config.IsEnabled;
});
});
}
public static IWidgetBuilder Create() => new WidgetBuilder();
public IWidgetHost Build()
{
IHost host = hostBuilder.Build();
return host.Services.GetRequiredService<IWidgetHost>();
}
public IWidgetBuilder UseConfiguration<TConfiguration>(Action<TConfiguration> configurationDelegate)
where TConfiguration :
WidgetConfiguration,
new()
{
if (configurationRegistered)
{
return this;
}
configurationRegistered = true;
TConfiguration configuration = new();
configurationDelegate(configuration);
hostBuilder.ConfigureServices(services =>
{
services.AddHandler<WidgetConfigurationHandler>();
services.AddConfiguration<WidgetConfiguration>(section: configuration.GetType().Name,
configuration: configuration);
services.AddConfiguration(configuration);
});
return this;
}
public IWidgetBuilder ConfigureServices(Action<IServiceCollection> configureDelegate)
{
hostBuilder.ConfigureServices(configureDelegate);
return this;
}
public IWidgetBuilder UseViewModel<TViewModel>()
where TViewModel :
IWidgetViewModel
{
if (viewModelTemplateRegistered)
{
return this;
}
viewModelTemplateRegistered = true;
hostBuilder.ConfigureServices(services =>
{
services.AddWidgetTemplate<TViewModel>();
});
return this;
}
public IWidgetBuilder UseViewModelTemplate<TWidgetContent, TWidgetTemplate>()
where TWidgetContent :
IWidgetViewModel
{
if (viewModelTemplateRegistered)
{
return this;
}
viewModelTemplateRegistered = true;
hostBuilder.ConfigureServices(services =>
{
services.AddWidgetTemplate<TWidgetContent, TWidgetTemplate>();
});
return this;
}
}