From a44391f4d59c8da84462a29c9c9fe52578c7e3e5 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sun, 12 May 2024 12:22:04 +0100 Subject: [PATCH] Add support for self scope --- Toolkit.Foundation/ComponentBuilder.cs | 3 +-- Toolkit.Foundation/DefaultHostBuilder.cs | 9 ++++--- Toolkit.Foundation/NavigateHandler.cs | 26 ++++++++++++------- .../ObservableCollectionViewModel.cs | 12 +++++++-- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/Toolkit.Foundation/ComponentBuilder.cs b/Toolkit.Foundation/ComponentBuilder.cs index 4bb92d1..bc3ffdf 100644 --- a/Toolkit.Foundation/ComponentBuilder.cs +++ b/Toolkit.Foundation/ComponentBuilder.cs @@ -29,13 +29,12 @@ public class ComponentBuilder : services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddScoped(); - services.AddTransient(); services.AddTransient(); diff --git a/Toolkit.Foundation/DefaultHostBuilder.cs b/Toolkit.Foundation/DefaultHostBuilder.cs index e48a207..a65616e 100644 --- a/Toolkit.Foundation/DefaultHostBuilder.cs +++ b/Toolkit.Foundation/DefaultHostBuilder.cs @@ -24,11 +24,12 @@ public class DefaultHostBuilder : ComponentHostCollection>(); services.AddScoped(); - services.AddScoped(); + + services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddScoped(); + services.AddTransient(); + services.AddTransient(); services.AddScoped>(provider => new ProxyService(provider.GetRequiredService())); @@ -48,7 +49,7 @@ public class DefaultHostBuilder : services.AddScoped(); services.AddTransient(); - services.AddTransient(); + services.AddScoped(); services.AddSingleton(new NamedComponent("Root")); services.AddScoped(provider => new ComponentScopeCollection diff --git a/Toolkit.Foundation/NavigateHandler.cs b/Toolkit.Foundation/NavigateHandler.cs index 9ee3d04..cb8b6c2 100644 --- a/Toolkit.Foundation/NavigateHandler.cs +++ b/Toolkit.Foundation/NavigateHandler.cs @@ -3,20 +3,28 @@ namespace Toolkit.Foundation; public class NavigateHandler(NamedComponent scope, - IComponentScopeProvider provider) : + IComponentScopeProvider componentScopeProvider, + IServiceProvider provider) : INotificationHandler { public async Task Handle(Navigate args, - CancellationToken cancellationToken) + CancellationToken cancellationToken) { - if (provider.Get(args.Scope ?? scope.Name) - is ComponentScopeDescriptor descriptor) + INavigationScope? navigationScope; + if (args.Scope == "self") { - if (descriptor?.Services?.GetService() is INavigationScope navigationScope) - { - await navigationScope.NavigateAsync(args.Route, args.Sender, - args.Context, args.Navigated, args.Parameters, cancellationToken); - } + navigationScope = provider.GetRequiredService(); + } + else + { + ComponentScopeDescriptor? descriptor = componentScopeProvider.Get(args.Scope ?? scope.Name); + navigationScope = descriptor?.Services?.GetRequiredService(); + } + + if (navigationScope is not null) + { + await navigationScope.NavigateAsync(args.Route, args.Sender, + args.Context, args.Navigated, args.Parameters, cancellationToken); } } } \ No newline at end of file diff --git a/Toolkit.Foundation/ObservableCollectionViewModel.cs b/Toolkit.Foundation/ObservableCollectionViewModel.cs index ff1748d..ffc1b0c 100644 --- a/Toolkit.Foundation/ObservableCollectionViewModel.cs +++ b/Toolkit.Foundation/ObservableCollectionViewModel.cs @@ -1,4 +1,5 @@ using CommunityToolkit.Mvvm.ComponentModel; +using Microsoft.Extensions.DependencyInjection; using System.Collections; using System.Collections.ObjectModel; using System.Collections.Specialized; @@ -140,11 +141,18 @@ public partial class ObservableCollectionViewModel : return item; } - public TViewModel Add() + public TViewModel Add(bool scope = false) where T : TViewModel { - T? item = Factory.Create(); + IServiceFactory? factory = null; + if (scope) + { + IServiceScope serviceScope = Provider.CreateScope(); + factory = serviceScope.ServiceProvider.GetRequiredService(); + } + + T? item = factory is not null ? factory.Create() : Factory.Create(); Add(item); return item;