Add per plugin json configuration support from a single file

This commit is contained in:
TheXamlGuy
2024-01-05 21:54:48 +00:00
parent e180c966ff
commit b380f06fbf
30 changed files with 277 additions and 541 deletions
+18 -4
View File
@@ -3,6 +3,7 @@ using Hyperbar.Desktop.Controls;
using Hyperbar.Desktop.Primary;
using Hyperbar.Lifecycles;
using Hyperbar.Templates;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.UI.Xaml;
@@ -11,6 +12,10 @@ using System.Collections.Generic;
namespace Hyperbar.Desktop;
public class AppConfiguration
{
}
public partial class App :
Application
{
@@ -22,7 +27,14 @@ public partial class App :
IHost? host = Host.CreateDefaultBuilder()
.UseContentRoot(AppContext.BaseDirectory)
.ConfigureServices(services =>
.ConfigureAppConfiguration(config =>
{
config.SetBasePath(AppContext.BaseDirectory);
config.AddJsonFile("Settings.json", true);
config.Build();
})
.ConfigureServices((context, services) =>
{
services.AddHostedService<AppService>();
@@ -34,8 +46,8 @@ public partial class App :
services.AddDataTemplate<CommandViewModel, CommandView>();
services.AddCommandBuilder<ContextualCommandBuilder>("Contexual.Commands");
services.AddCommandBuilder<PrimaryCommandBuilder>("Primary.Command");
services.AddCommand<ContextualCommandBuilder>("");
services.AddCommand<PrimaryCommandBuilder>("");
services.AddTransient(provider =>
{
@@ -53,9 +65,11 @@ public partial class App :
return Resolve(provider);
});
services.ConfigureWritableOptions<AppConfiguration>();
})
.Build();
await host.RunAsync();
}
}
+7 -22
View File
@@ -14,8 +14,8 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Remove="ContextualCommandView.xaml" />
<None Remove="Views\CommandView.xaml" />
<None Remove="ContextualCommandView.xaml" />
<None Remove="Views\CommandView.xaml" />
</ItemGroup>
<ItemGroup>
<Content Include="Assets\SplashScreen.scale-200.png" />
@@ -36,27 +36,12 @@
<ProjectCapability Include="Msix" />
</ItemGroup>
<ItemGroup>
<Page Update="CommandHostView.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Hyperbar.Desktop.Contextual\Hyperbar.Desktop.Contextual.csproj" />
<ProjectReference Include="..\Hyperbar.Desktop.Controls\Hyperbar.Desktop.Controls.csproj" />
<ProjectReference Include="..\Hyperbar.Desktop.Primary\Hyperbar.Desktop.Primary.csproj" />
<ProjectReference Include="..\Hyperbar\Hyperbar.csproj" />
</ItemGroup>
<ItemGroup>
<Page Update="ContextualCommandView.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="Views\CommandView.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
<ProjectReference Include="..\Hyperbar.Desktop.Contextual\Hyperbar.Desktop.Contextual.csproj" />
<ProjectReference Include="..\Hyperbar.Desktop.Controls\Hyperbar.Desktop.Controls.csproj" />
<ProjectReference Include="..\Hyperbar.Desktop.Primary\Hyperbar.Desktop.Primary.csproj" />
<ProjectReference Include="..\Hyperbar\Hyperbar.csproj" />
</ItemGroup>
<PropertyGroup Condition="'$(DisableHasPackageAndPublishMenuAddedByProject)'!='true' and '$(EnableMsixTooling)'=='true'">
<HasPackageAndPublishMenu>true</HasPackageAndPublishMenu>
</PropertyGroup>
</Project>
</Project>
@@ -5,8 +5,8 @@ using System.Threading.Tasks;
namespace Hyperbar.Desktop;
public class AppInitializer([FromKeyedServices(nameof(CommandView))] CommandView view,
[FromKeyedServices(nameof(CommandView))] CommandViewModel viewModel,
public class AppInitializer([FromKeyedServices(nameof(CommandViewModel))] CommandView view,
[FromKeyedServices(nameof(CommandViewModel))] CommandViewModel viewModel,
DesktopFlyout desktopFlyout) :
IInitializer
{
@@ -7,19 +7,19 @@ namespace Hyperbar.Desktop
{
public static class IServiceCollectionExtensions
{
public static IServiceCollection AddCommandBuilder<TCommandBuilder>(this IServiceCollection services,
public static IServiceCollection AddCommand<TCommandBuilder>(this IServiceCollection services,
string key)
where TCommandBuilder :
ICommandBuilder, new()
{
TCommandBuilder builder = new();
IHost? host = new HostBuilder()
.ConfigureServices(services =>
.ConfigureServices(isolatedServices =>
{
services.AddTransient<ITemplateFactory, TemplateFactory>();
services.AddTransient<ITemplateGeneratorFactory, TemplateGeneratorFactory>();
isolatedServices.AddTransient<ITemplateFactory, TemplateFactory>();
isolatedServices.AddTransient<ITemplateGeneratorFactory, TemplateGeneratorFactory>();
builder.Create(services);
builder.Create(isolatedServices);
}).Build();
services.AddTransient<ICommandContext>(provider => new CommandContext(host.Services));
-1
View File
@@ -9,6 +9,5 @@
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Page>
+4 -6
View File
@@ -1,6 +1,5 @@
using Hyperbar.Lifecycles;
using Hyperbar.Templates;
using System.Collections;
using System.Collections.Generic;
namespace Hyperbar.Desktop;
@@ -10,14 +9,13 @@ public partial class CommandViewModel :
ITemplatedViewModel
{
public CommandViewModel(ITemplateFactory templateFactory,
IEnumerable<ICommandViewModel> commands)
IEnumerable<ICommandViewModel> commands,
IWritableConfiguration<AppConfiguration> options)
{
TemplateFactory = templateFactory;
AddRange(commands);
foreach (var command in commands)
{
this.Add(command);
}
options.Update(args => { });
}
public ITemplateFactory TemplateFactory { get; }