Viewmodel caching WIP

This commit is contained in:
TheXamlGuy
2024-01-12 21:57:47 +00:00
parent 2a773f26db
commit b47a563876
9 changed files with 59 additions and 15 deletions
@@ -0,0 +1,11 @@
namespace Hyperbar.Windows.Primary;
public class ConfigurationChangedHandler :
INotificationHandler<ConfigurationChanged<PrimaryWidgetConfiguration>>
{
public ValueTask Handle(ConfigurationChanged<PrimaryWidgetConfiguration> notification,
CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}
@@ -8,10 +8,10 @@ public class PrimaryWidgetProvider :
{ {
public void Create(HostBuilderContext comtext, IServiceCollection services) => public void Create(HostBuilderContext comtext, IServiceCollection services) =>
services.AddConfiguration<PrimaryWidgetConfiguration>() services.AddConfiguration<PrimaryWidgetConfiguration>()
.AddTransient<IViewModelEnumerator<IWidgetComponentViewModel>, WidgetComponentViewModelEnumerator>() .AddTransient<IViewModelCache<Guid, IWidgetComponentViewModel>, ViewModelCache<Guid, IWidgetComponentViewModel>>()
.AddTransient<IViewModelFactory<PrimaryCommandConfiguration, IWidgetComponentViewModel?>, WidgetComponentViewModelFactory>() .AddTransient<IViewModelFactory<PrimaryCommandConfiguration, IWidgetComponentViewModel?>, WidgetComponentViewModelFactory>()
.AddTransient<IViewModelEnumerator<IWidgetComponentViewModel>, WidgetComponentViewModelEnumerator>()
.AddWidgetTemplate<PrimaryWidgetViewModel>() .AddWidgetTemplate<PrimaryWidgetViewModel>()
.AddNotificationPipeline<ConfigurationChanged<PrimaryWidgetConfiguration>, .AddHandler<ConfigurationChangedHandler>();
CollectionChanged<IEnumerable<IWidgetComponentViewModel>>>();
} }
@@ -1,4 +1,5 @@
namespace Hyperbar.Windows.Primary; namespace Hyperbar.Windows.Primary;
public class PrimaryWidgetViewModel(ITemplateFactory templateFactory, public class PrimaryWidgetViewModel(ITemplateFactory templateFactory,
@@ -3,26 +3,34 @@
namespace Hyperbar.Windows.Primary; namespace Hyperbar.Windows.Primary;
public class WidgetComponentViewModelFactory(IServiceFactory service, public class WidgetComponentViewModelFactory(IServiceFactory service,
IMediator mediator) : IMediator mediator,
IViewModelCache<Guid, IWidgetComponentViewModel> cache) :
IViewModelFactory<PrimaryCommandConfiguration, IWidgetComponentViewModel?> IViewModelFactory<PrimaryCommandConfiguration, IWidgetComponentViewModel?>
{ {
public async ValueTask<IWidgetComponentViewModel?> CreateAsync(PrimaryCommandConfiguration value) public async ValueTask<IWidgetComponentViewModel?> CreateAsync(PrimaryCommandConfiguration value)
{ {
IWidgetComponentViewModel? viewModel = null;
if (value is KeyAcceleratorCommandConfiguration keyAcceleratorCommand) if (value is KeyAcceleratorCommandConfiguration keyAcceleratorCommand)
{ {
return await ValueTask.FromResult(service.Create<WidgetButtonViewModel>(keyAcceleratorCommand.Id, keyAcceleratorCommand.Icon, viewModel = service.Create<WidgetButtonViewModel>(keyAcceleratorCommand.Id, keyAcceleratorCommand.Icon,
new RelayCommand(async () => await mediator.SendAsync(new KeyAcceleratorRequest((VirtualKey) new RelayCommand(async () => await mediator.SendAsync(new KeyAcceleratorRequest((VirtualKey)
keyAcceleratorCommand.Key, keyAcceleratorCommand.Modifiers? keyAcceleratorCommand.Key, keyAcceleratorCommand.Modifiers?
.Select(modifier => (VirtualKey)modifier).ToArray()))))); .Select(modifier => (VirtualKey)modifier).ToArray()))));
} }
if (value is ProcessCommandConfiguration commandConfiguration) if (value is ProcessCommandConfiguration commandConfiguration)
{ {
return await ValueTask.FromResult(service.Create<WidgetButtonViewModel>(commandConfiguration.Id, viewModel = service.Create<WidgetButtonViewModel>(commandConfiguration.Id,
commandConfiguration.Icon, new RelayCommand(async () => commandConfiguration.Icon, new RelayCommand(async () =>
await mediator.SendAsync(new ProcessRequest(commandConfiguration.Path))))); await mediator.SendAsync(new ProcessRequest(commandConfiguration.Path))));
} }
return default; if (viewModel is not null)
{
cache.Add(value.Id, viewModel);
}
return viewModel ?? default;
} }
} }
-6
View File
@@ -1,6 +0,0 @@
namespace Hyperbar;
public interface IViewModelFactory<TIn, TOut>
{
ValueTask<TOut> CreateAsync(TIn value);
}
+30
View File
@@ -0,0 +1,30 @@
namespace Hyperbar;
public interface IViewModelFactory<TParameter, TViewModel>
{
ValueTask<TViewModel> CreateAsync(TParameter value);
}
public interface IViewModelCache<TKey, TViewModel>
{
void Add(TKey key, TViewModel value);
void Remove(TKey key);
}
public class ViewModelCache<TKey, TViewModel> :
IViewModelCache<TKey, TViewModel>
{
private readonly Dictionary<TKey, TViewModel> cache = [];
public void Add(TKey key,
TViewModel value)
{
cache.TryAdd(key, value);
}
public void Remove(TKey key)
{
cache.Remove(key);
}
}