From a7fe14d60eda853ac83731ce76ae0643515e13fd Mon Sep 17 00:00:00 2001 From: Matt Goldman Date: Sun, 19 Nov 2023 09:44:44 +1100 Subject: [PATCH] Removed preview depdencies (#23) Fixed bug navigating with parameters and injected depdendencies --- src/DemoProject/DemoProject.csproj | 6 ++-- src/DemoProject/Pages/VmParamPage.xaml | 29 ++++++++++------- src/DemoProject/ViewModels/MainViewModel.cs | 4 +-- .../ViewModels/VmParamViewModel.cs | 5 ++- ...ugins.PageResolver.SourceGenerators.csproj | 4 +-- .../Maui.Plugins.PageResolver.csproj | 6 ++-- .../NavigationExtensions.cs | 32 ++++++++++++++----- 7 files changed, 55 insertions(+), 31 deletions(-) diff --git a/src/DemoProject/DemoProject.csproj b/src/DemoProject/DemoProject.csproj index f8ae8a4..a20c182 100644 --- a/src/DemoProject/DemoProject.csproj +++ b/src/DemoProject/DemoProject.csproj @@ -50,15 +50,15 @@ - + - + true diff --git a/src/DemoProject/Pages/VmParamPage.xaml b/src/DemoProject/Pages/VmParamPage.xaml index 6d341e5..70d4767 100644 --- a/src/DemoProject/Pages/VmParamPage.xaml +++ b/src/DemoProject/Pages/VmParamPage.xaml @@ -1,17 +1,24 @@ - - \ No newline at end of file diff --git a/src/DemoProject/ViewModels/MainViewModel.cs b/src/DemoProject/ViewModels/MainViewModel.cs index 0d70dca..4f31f00 100644 --- a/src/DemoProject/ViewModels/MainViewModel.cs +++ b/src/DemoProject/ViewModels/MainViewModel.cs @@ -40,9 +40,7 @@ async Task GoToPageParamPage() async Task GoToVmParamPage() { - Name = _nameService.GetName(); - - await Navigation.PushAsync(Name); + await Navigation.PushAsync("Name passed as parameter"); } async Task GoToMarkup() diff --git a/src/DemoProject/ViewModels/VmParamViewModel.cs b/src/DemoProject/ViewModels/VmParamViewModel.cs index 36d6c40..21820c2 100644 --- a/src/DemoProject/ViewModels/VmParamViewModel.cs +++ b/src/DemoProject/ViewModels/VmParamViewModel.cs @@ -4,8 +4,11 @@ public class VmParamViewModel { public string NameParam { get; set; } - public VmParamViewModel(string name) + public string NameFromServiceParam { get; set; } + + public VmParamViewModel(INameService nameService, string name) { NameParam = name; + NameFromServiceParam = nameService.GetName(); } } diff --git a/src/Maui.Plugins.PageResolver.SourceGenerators/Maui.Plugins.PageResolver.SourceGenerators.csproj b/src/Maui.Plugins.PageResolver.SourceGenerators/Maui.Plugins.PageResolver.SourceGenerators.csproj index 06cee87..4d6d4d5 100644 --- a/src/Maui.Plugins.PageResolver.SourceGenerators/Maui.Plugins.PageResolver.SourceGenerators.csproj +++ b/src/Maui.Plugins.PageResolver.SourceGenerators/Maui.Plugins.PageResolver.SourceGenerators.csproj @@ -35,10 +35,10 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/Maui.Plugins.PageResolver/Maui.Plugins.PageResolver.csproj b/src/Maui.Plugins.PageResolver/Maui.Plugins.PageResolver.csproj index 2db45bc..f354bc1 100644 --- a/src/Maui.Plugins.PageResolver/Maui.Plugins.PageResolver.csproj +++ b/src/Maui.Plugins.PageResolver/Maui.Plugins.PageResolver.csproj @@ -6,15 +6,15 @@ Matt Goldman https://github.com/matt-goldman/Maui.Plugins.PageResolver - Matt Goldman 2022 + Matt Goldman 2023 true Goldie.MauiPlugins.PageResolver - A simple lightweight page resolver for dotnet MAUI projects. Uses the built in DI container to resolve dependencies and push a resolve page onto the navigation stack. + A simple lightweight page resolver for dotnet MAUI projects. Uses the built in DI container to resolve dependencies and push a resolved page onto the navigation stack. gfg.png LICENSE - 2.0.0-preview1 + 2.0.1 diff --git a/src/Maui.Plugins.PageResolver/NavigationExtensions.cs b/src/Maui.Plugins.PageResolver/NavigationExtensions.cs index 5b30879..a5200b6 100644 --- a/src/Maui.Plugins.PageResolver/NavigationExtensions.cs +++ b/src/Maui.Plugins.PageResolver/NavigationExtensions.cs @@ -111,17 +111,22 @@ private static Page CreatePageWithViewModel(IServiceProvider serviceProvider, private static bool ParametersMatchConstructors(Type type, params object[] parameters) { + var sp = Resolver.GetServiceProvider(); + var constructors = type.GetConstructors(); foreach (var constructor in constructors) { var ctorParams = constructor.GetParameters(); - if (ctorParams.Length == parameters.Length) + + var nonInjectableParams = ctorParams.Where(p => !IsRegisteredDependency(sp, p.ParameterType)).ToArray(); + + if (nonInjectableParams.Length == parameters.Length) { - for (int i = 0; i < ctorParams.Length; i++) + for (int i = 0; i < nonInjectableParams.Length; i++) { - if (!ctorParams[i].ParameterType.IsAssignableFrom(parameters[i].GetType())) + if (!nonInjectableParams[i].ParameterType.IsAssignableFrom(parameters[i].GetType())) break; - if (i == ctorParams.Length - 1) + if (i == nonInjectableParams.Length - 1) return true; // all parameters match } } @@ -131,17 +136,22 @@ private static bool ParametersMatchConstructors(Type type, params object[] param private static bool ParametersMatchConstructorsExcludingType(Type type, Type excludeType, params object[] parameters) { + var sp = Resolver.GetServiceProvider(); + var constructors = type.GetConstructors(); foreach (var constructor in constructors) { var ctorParams = constructor.GetParameters().Where(p => p.ParameterType != excludeType).ToArray(); - if (ctorParams.Length == parameters.Length) + + var nonInjectableParams = ctorParams.Where(p => !IsRegisteredDependency(sp, p.ParameterType)).ToArray(); + + if (nonInjectableParams.Length == parameters.Length) { - for (int i = 0; i < ctorParams.Length; i++) + for (int i = 0; i < nonInjectableParams.Length; i++) { - if (!ctorParams[i].ParameterType.IsAssignableFrom(parameters[i].GetType())) + if (!nonInjectableParams[i].ParameterType.IsAssignableFrom(parameters[i].GetType())) break; - if (i == ctorParams.Length - 1) + if (i == nonInjectableParams.Length - 1) return true; // all parameters match } } @@ -161,5 +171,11 @@ private static Page CreatePageUsingViewModel(IServiceProvider serviceProvider } } + private static bool IsRegisteredDependency(IServiceProvider serviceProvider, Type type) + { + var serviceDescriptors = serviceProvider.GetServices(type); + return serviceDescriptors.Any(); + } + #endregion } \ No newline at end of file