This commit is contained in:
TheXamlGuy
2024-04-26 22:27:31 +01:00
parent fd8a20c081
commit bab5f218e8
30 changed files with 164 additions and 108 deletions
+3 -2
View File
@@ -26,7 +26,8 @@ public partial class App : Application
services.AddHandler<AppHandler>(); services.AddHandler<AppHandler>();
services.AddTransient<IVaultComponent, VaultComponent>(); services.AddTransient<IVaultComponent, VaultComponent>();
services.AddInitializer<VaultConfigurationInitializer>(); services.AddTransient<IVaultFactory, VaultFactory>();
services.AddInitializer<VaultsInitializer>();
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime) if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime)
{ {
@@ -38,7 +39,7 @@ public partial class App : Application
services.AddHandler<VaultHandler>(); services.AddHandler<VaultHandler>();
services.AddTemplate<MainViewModel, MainView>("Main"); services.AddTemplate<MainViewModel, MainView>("Main");
services.AddHandler<MainViewModelHandler>(); services.AddHandler<VaultNavigationViewModelHandler>();
services.AddTransient<FooterViewModel>(); services.AddTransient<FooterViewModel>();
+3 -2
View File
@@ -1,5 +1,4 @@
using Microsoft.Extensions.DependencyInjection; using Toolkit.Foundation;
using Toolkit.Foundation;
namespace Bitvault.Avalonia; namespace Bitvault.Avalonia;
@@ -10,6 +9,8 @@ public class VaultComponent :
ComponentBuilder.Create() ComponentBuilder.Create()
.AddServices(services => .AddServices(services =>
{ {
services.AddInitializer<VaultInitializer>();
services.AddTemplate<VaultNavigationViewModel, VaultNavigationView>(); services.AddTemplate<VaultNavigationViewModel, VaultNavigationView>();
services.AddTemplate<AllNavigationViewModel, AllNavigationView>(); services.AddTemplate<AllNavigationViewModel, AllNavigationView>();
services.AddTemplate<StarredNavigationViewModel, StarredNavigationView>(); services.AddTemplate<StarredNavigationViewModel, StarredNavigationView>();
+4 -3
View File
@@ -2,10 +2,11 @@
namespace Bitvault; namespace Bitvault;
public class AllNavigationViewModel(IServiceProvider serviceProvider, public class AllNavigationViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer), ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IMainNavigationViewModel; IMainNavigationViewModel;
+4 -3
View File
@@ -2,10 +2,11 @@
namespace Bitvault; namespace Bitvault;
public class ArchiveNavigationViewModel(IServiceProvider serviceProvider, public class ArchiveNavigationViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer), ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IMainNavigationViewModel; IMainNavigationViewModel;
+1
View File
@@ -6,6 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /> <PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
<PackageReference Include="LiteDB" Version="5.0.19" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.0-preview.3.24172.9" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.0-preview.3.24172.9" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
+4 -3
View File
@@ -2,10 +2,11 @@
namespace Bitvault; namespace Bitvault;
public class CategoriesNavigationViewModel(IServiceProvider serviceProvider, public class CategoriesNavigationViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer), ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IMainNavigationViewModel; IMainNavigationViewModel;
+6 -11
View File
@@ -2,16 +2,11 @@
namespace Bitvault; namespace Bitvault;
public partial class CreateVaultNavigationViewModel : public partial class CreateVaultNavigationViewModel(IServiceProvider provider,
ObservableViewModel, IServiceFactory factory,
IMainNavigationViewModel IMediator mediator,
{
public CreateVaultNavigationViewModel(IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) IDisposer disposer) :
{ ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IMainNavigationViewModel;
}
}
+4 -3
View File
@@ -4,12 +4,13 @@ using Toolkit.Foundation;
namespace Bitvault; namespace Bitvault;
public partial class CreateVaultViewModel(IServiceProvider serviceProvider, public partial class CreateVaultViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IPublisher publisher, IPublisher publisher,
IMediator mediator,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer), ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IPrimaryConfirmation IPrimaryConfirmation
{ {
[MaybeNull] [MaybeNull]
+4 -3
View File
@@ -5,11 +5,12 @@ namespace Bitvault;
public partial class FooterViewModel : public partial class FooterViewModel :
ObservableCollectionViewModel<IMainNavigationViewModel> ObservableCollectionViewModel<IMainNavigationViewModel>
{ {
public FooterViewModel(IServiceProvider serviceProvider, public FooterViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer)
{ {
Add<ManageNavigationViewModel>(); Add<ManageNavigationViewModel>();
} }
+3 -2
View File
@@ -1,8 +1,9 @@
using Toolkit.Foundation;
namespace Bitvault namespace Bitvault
{ {
public interface IVaultFactory public interface IVaultFactory
{ {
Task CreateAsync(string name, VaultConfiguration configuration); IComponentHost? Create(string name, VaultConfiguration configuration);
} }
} }
+5
View File
@@ -0,0 +1,5 @@
using Toolkit.Foundation;
namespace Bitvault;
public interface IVaultHost : IComponentHost;
+4 -9
View File
@@ -2,15 +2,10 @@
namespace Bitvault; namespace Bitvault;
public class LockViewModel(IServiceProvider serviceProvider, public class LockViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer) ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer);
{
//public Task<bool> Confirm()
//{
// //return Task.FromResult(false);
//}
}
+2 -4
View File
@@ -1,5 +1,3 @@
using Toolkit.Foundation; namespace Bitvault;
namespace Bitvault; public record Locked;
public record Locked : INotification;
+4 -3
View File
@@ -2,9 +2,10 @@
namespace Bitvault; namespace Bitvault;
public class LockerNavigationViewModel(IServiceProvider serviceProvider, public class LockerNavigationViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer); ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer);
+4 -3
View File
@@ -2,9 +2,10 @@
namespace Bitvault; namespace Bitvault;
public class LockerViewModel(IServiceProvider serviceProvider, public class LockerViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer); ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer);
+4 -3
View File
@@ -10,13 +10,14 @@ public partial class MainViewModel :
[ObservableProperty] [ObservableProperty]
private FooterViewModel footer; private FooterViewModel footer;
public MainViewModel(IServiceProvider serviceProvider, public MainViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template, IContentTemplate template,
FooterViewModel footer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) FooterViewModel footer) : base(provider, factory, mediator, publisher, subscriber, disposer)
{ {
Template = template; Template = template;
Footer = footer; Footer = footer;
+4 -3
View File
@@ -2,9 +2,10 @@
namespace Bitvault; namespace Bitvault;
public class MainWindowViewModel(IServiceProvider serviceProvider, public class MainWindowViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer); ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer);
+4 -3
View File
@@ -6,11 +6,12 @@ public partial class ManageNavigationViewModel :
ObservableViewModel, ObservableViewModel,
IMainNavigationViewModel IMainNavigationViewModel
{ {
public ManageNavigationViewModel(IServiceProvider serviceProvider, public ManageNavigationViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer)
{ {
} }
+4 -3
View File
@@ -7,12 +7,13 @@ public partial class ManageViewModel :
ObservableCollectionViewModel, ObservableCollectionViewModel,
IMainNavigationViewModel IMainNavigationViewModel
{ {
public ManageViewModel(IServiceProvider serviceProvider, public ManageViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) IContentTemplate template) : base(provider, factory, mediator, publisher, subscriber, disposer)
{ {
Template = template; Template = template;
+4 -3
View File
@@ -2,10 +2,11 @@
namespace Bitvault; namespace Bitvault;
public class StarredNavigationViewModel(IServiceProvider serviceProvider, public class StarredNavigationViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer), ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IMainNavigationViewModel; IMainNavigationViewModel;
+2 -4
View File
@@ -1,5 +1,3 @@
using Toolkit.Foundation; namespace Bitvault;
namespace Bitvault; public record Unlocked;
public record Unlocked : INotification;
-16
View File
@@ -1,16 +0,0 @@
using Toolkit.Foundation;
namespace Bitvault;
public class VaultConfigurationInitializer(IEnumerable<IConfigurationDescriptor<VaultConfiguration>> configurations,
IVaultFactory factory) : IInitializer
{
public async Task Initialize()
{
foreach (IConfigurationDescriptor<VaultConfiguration> configuration in configurations)
{
await factory.CreateAsync(configuration.Section,
configuration.Value);
}
}
}
+4 -2
View File
@@ -8,7 +8,7 @@ public class VaultFactory(IServiceProvider provider,
IComponentScopeCollection scopes, IComponentScopeCollection scopes,
IVaultHostCollection vaults) : IVaultFactory IVaultHostCollection vaults) : IVaultFactory
{ {
public async Task CreateAsync(string name, public IComponentHost? Create(string name,
VaultConfiguration configuration) VaultConfiguration configuration)
{ {
if (provider.GetRequiredService<IVaultComponent>() is IVaultComponent component) if (provider.GetRequiredService<IVaultComponent>() is IVaultComponent component)
@@ -45,7 +45,9 @@ public class VaultFactory(IServiceProvider provider,
host.Services.GetRequiredService<IServiceProvider>())); host.Services.GetRequiredService<IServiceProvider>()));
vaults.Add(host); vaults.Add(host);
await host.StartAsync(); return host;
} }
return default;
} }
} }
+27 -6
View File
@@ -2,14 +2,35 @@
namespace Bitvault; namespace Bitvault;
public class VaultHandler(IVaultFactory factory) : INotificationHandler<Create<Vault>>
public class VaultStorageHandler :
INotificationHandler<Create<VaultStorage>>
{ {
public async Task Handle(Create<Vault> args, public Task Handle(Create<VaultStorage> args,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
if (args.Value is Vault vault) throw new NotImplementedException();
{ }
await factory.CreateAsync($"Vault:{vault.Name}", new VaultConfiguration { Name = vault.Name }); }
}
public record VaultStorage(string Name);
public class VaultHandler(IVaultFactory factory) :
IHandler<Create<Vault>, bool>
{
//public async Task Handle(Create<Vault> args,
// CancellationToken cancellationToken = default)
//{
// if (args.Value is Vault vault)
// {
// if (factory.Create($"Vault:{vault.Name}", new VaultConfiguration { Name = vault.Name }) is IComponentHost host)
// {
// await host.StartAsync(cancellationToken);
// }
// }
//}
public Task<bool> Handle(Create<Vault> args, CancellationToken cancellationToken)
{
throw new NotImplementedException();
} }
} }
+1 -4
View File
@@ -9,10 +9,7 @@ public class VaultHostCollection :
{ {
private readonly List<IComponentHost> hosts = []; private readonly List<IComponentHost> hosts = [];
public void Add(IComponentHost host) public void Add(IComponentHost host) => hosts.Add(host);
{
hosts.Add(host);
}
public IEnumerator<IComponentHost> GetEnumerator() => public IEnumerator<IComponentHost> GetEnumerator() =>
hosts.GetEnumerator(); hosts.GetEnumerator();
+26
View File
@@ -0,0 +1,26 @@
using Microsoft.Extensions.DependencyInjection;
using Toolkit.Foundation;
namespace Bitvault;
public class VaultInitializer(IServiceProvider provider,
IProxyService<IPublisher> publisher) : IInitializer
{
public async Task Initialize()
{
if (provider.GetService<IComponentHost>() is IComponentHost vault)
{
if (vault.Services.GetRequiredService<VaultConfiguration>() is VaultConfiguration configuration)
{
if (vault.Services.GetRequiredService<IServiceFactory>() is IServiceFactory factory)
{
if (factory.Create<VaultNavigationViewModel>(configuration.Name) is VaultNavigationViewModel viewModel)
{
await publisher.Proxy.Publish(new Create<IMainNavigationViewModel>(viewModel),
nameof(MainViewModel));
}
}
}
}
}
}
+4 -4
View File
@@ -15,19 +15,19 @@ public partial class VaultNavigationViewModel :
[ObservableProperty] [ObservableProperty]
private string name; private string name;
public VaultNavigationViewModel(IServiceProvider serviceProvider, public VaultNavigationViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template, IContentTemplate template,
string name) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) string name) : base(provider, factory, mediator, publisher, subscriber, disposer)
{ {
Template = template; Template = template;
Name = name; Name = name;
} }
public IContentTemplate Template { get; set; } public IContentTemplate Template { get; set; }
@@ -3,7 +3,7 @@ using Toolkit.Foundation;
namespace Bitvault; namespace Bitvault;
public class MainViewModelHandler(IPublisher publisher, public class VaultNavigationViewModelHandler(IPublisher publisher,
IVaultHostCollection vaults) : IVaultHostCollection vaults) :
INotificationHandler<Enumerate<IMainNavigationViewModel>> INotificationHandler<Enumerate<IMainNavigationViewModel>>
{ {
+4 -3
View File
@@ -2,9 +2,10 @@
namespace Bitvault; namespace Bitvault;
public class VaultViewModel(IServiceProvider serviceProvider, public class VaultViewModel(IServiceProvider provider,
IServiceFactory serviceFactory, IServiceFactory factory,
IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer) : IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer); ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer);
+18
View File
@@ -0,0 +1,18 @@
using Toolkit.Foundation;
namespace Bitvault;
public class VaultsInitializer(IEnumerable<IConfigurationDescriptor<VaultConfiguration>> configurations,
IVaultFactory factory) : IInitializer
{
public async Task Initialize()
{
foreach (IConfigurationDescriptor<VaultConfiguration> configuration in configurations)
{
if (factory.Create(configuration.Section, configuration.Value) is IComponentHost host)
{
await host.StartAsync();
}
}
}
}