Skip to content

Commit

Permalink
Merge pull request #2110 from PrismLibrary/scopednavigation
Browse files Browse the repository at this point in the history
Scope the NavigationService to the Page
  • Loading branch information
dansiegel committed May 5, 2020
2 parents 527faaf + 0374fcb commit 6244391
Show file tree
Hide file tree
Showing 47 changed files with 512 additions and 255 deletions.
15 changes: 3 additions & 12 deletions build/jobs/uno-uitest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,18 @@ jobs:

- job: UnoUITest_Wasm
displayName: Uno UITest WebAssembly

container: unoplatform/wasm-build:2.0

condition: and(succeeded(), eq(variables['EnableUITest'], 'true'))
pool:
vmImage: $(LinuxImage)

workspace:
clean: all

steps:

- bash: |
build/scripts/wasm-uitest-run.sh
env:
BUILD_SOURCESDIRECTORY: "$(build.sourcesdirectory)"
BUILD_ARTIFACTSTAGINGDIRECTORY: "$(build.artifactstagingdirectory)"
displayName: 'Run UI Tests'
- task: PublishTestResults@2
Expand All @@ -37,10 +31,9 @@ jobs:
ArtifactName: UnoUITests
ArtifactType: Container


- job: UnoUITest_Android
displayName: Uno UITest Android

condition: and(succeeded(), eq(variables['EnableUITest'], 'true'))
pool:
vmImage: $(MacImage)

Expand Down Expand Up @@ -77,13 +70,11 @@ jobs:

- job: UnoUITest_iOS
displayName: Uno UITest iOS

condition: and(succeeded(), eq(variables['EnableUITest'], 'true'))
pool:
vmImage: $(MacImage)

workspace:
clean: all

steps:
- template: ../steps/set-runtime.yml

Expand Down
10 changes: 10 additions & 0 deletions e2e/Forms/HelloWorld.sln
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Prism.Forms", "..\..\src\Fo
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Prism.DryIoc.Forms", "..\..\src\Forms\Prism.DryIoc.Forms\Prism.DryIoc.Forms.csproj", "{74F5E189-BF46-4D6A-BDF9-752D44E3E2DD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "containers", "containers", "{65A6E069-67F8-494E-9B34-FFBDBD587A75}"
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Prism.DryIoc.Shared", "..\..\src\Containers\Prism.DryIoc.Shared\Prism.DryIoc.Shared.shproj", "{6E7EC81D-DA39-4C4F-A898-0148558C34F4}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
..\..\src\Containers\Prism.DryIoc.Shared\Prism.DryIoc.Shared.projitems*{6e7ec81d-da39-4c4f-a898-0148558c34f4}*SharedItemsImports = 13
..\..\src\Containers\Prism.DryIoc.Shared\Prism.DryIoc.Shared.projitems*{74f5e189-bf46-4d6a-bdf9-752d44e3e2dd}*SharedItemsImports = 5
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
Ad-Hoc|ARM = Ad-Hoc|ARM
Expand Down Expand Up @@ -701,6 +709,8 @@ Global
{57CAB459-1FE8-45FB-9E73-EDBE84F7E190} = {FAF925D4-455B-448F-B048-6469DE52D341}
{966CA02B-30A1-41A6-B514-BE8BDF942EF3} = {FAF925D4-455B-448F-B048-6469DE52D341}
{74F5E189-BF46-4D6A-BDF9-752D44E3E2DD} = {FAF925D4-455B-448F-B048-6469DE52D341}
{65A6E069-67F8-494E-9B34-FFBDBD587A75} = {FAF925D4-455B-448F-B048-6469DE52D341}
{6E7EC81D-DA39-4C4F-A898-0148558C34F4} = {65A6E069-67F8-494E-9B34-FFBDBD587A75}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9E406BB3-20B9-4659-9660-A29BE45C4626}
Expand Down
4 changes: 0 additions & 4 deletions e2e/Forms/src/HelloDialog/HelloDialog.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="3.6.0.344457" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\..\src\Forms\Prism.Forms\Prism.Forms.csproj" />
<ProjectReference Include="..\..\..\..\src\Prism.Core\Prism.Core.csproj" />
Expand Down
4 changes: 0 additions & 4 deletions e2e/Forms/src/HelloPageDialog/HelloPageDialog.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="3.6.0.344457" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\..\src\Forms\Prism.Forms\Prism.Forms.csproj" />
<ProjectReference Include="..\..\..\..\src\Prism.Core\Prism.Core.csproj" />
Expand Down
8 changes: 0 additions & 8 deletions e2e/Forms/src/HelloWorld.Android/HelloWorld.Android.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,6 @@
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="3.6.0.344457" />
<PackageReference Include="Xamarin.Android.Support.Design" Version="28.0.0.1" />
<PackageReference Include="Xamarin.Android.Support.v7.AppCompat" Version="28.0.0.1" />
<PackageReference Include="Xamarin.Android.Support.v4" Version="28.0.0.1" />
<PackageReference Include="Xamarin.Android.Support.v7.CardView" Version="28.0.0.1" />
<PackageReference Include="Xamarin.Android.Support.v7.MediaRouter" Version="28.0.0.1" />
</ItemGroup>
<ItemGroup>
<Compile Include="AndroidInitializer.cs" />
<Compile Include="MainActivity.cs" />
Expand Down
1 change: 0 additions & 1 deletion e2e/Forms/src/HelloWorld.UWP/HelloWorld.UWP.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,6 @@
</Page>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="3.6.0.344457" />
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform" Version="6.2.9" />
</ItemGroup>
<ItemGroup>
Expand Down
1 change: 0 additions & 1 deletion e2e/Forms/src/HelloWorld.iOS/HelloWorld.iOS.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,6 @@
<Reference Include="Xamarin.iOS" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="3.6.0.344457" />
<PackageReference Include="Xamarin.TestCloud.Agent" Version="0.21.9" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
Expand Down
70 changes: 38 additions & 32 deletions e2e/Forms/src/HelloWorld/App.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,67 +1,73 @@
using System;
using System.Threading.Tasks;
using HelloWorld.ViewModels;
using HelloWorld.Views;
using Prism;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Navigation;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

[assembly: XamlCompilation (XamlCompilationOptions.Compile)]
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace HelloWorld
{
#region Test Navigation Calls

//NavigationService.NavigateAsync("NavigationPage/MyTabbedPage"); //works
//NavigationService.NavigateAsync("NavigationPage/MyTabbedPage/ViewC"); //works
//NavigationService.NavigateAsync("NavigationPage/MyTabbedPage/ViewC/ViewA"); //works
//NavigationService.NavigateAsync("NavigationPage/ViewA/MyTabbedPage"); //works
//NavigationService.NavigateAsync("NavigationPage/ViewA/MyTabbedPage/ViewC"); //works
//NavigationService.NavigateAsync("NavigationPage/ViewA/MyTabbedPage/ViewC/ViewA/ViewB"); //works
//NavigationService.NavigateAsync("MyMasterDetail/NavigationPage/MyTabbedPage/ViewC"); //works

//NavigationService.NavigateAsync($"MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewA"); //works --
//NavigationService.NavigateAsync($"NavigationPage/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC"); //works
//NavigationService.NavigateAsync($"NavigationPage/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC"); //works
//NavigationService.NavigateAsync($"NavigationPage/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC/ViewA"); //works
//NavigationService.NavigateAsync($"NavigationPage/ViewA/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC"); //works
//NavigationService.NavigateAsync($"NavigationPage/ViewA/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC"); //works
//NavigationService.NavigateAsync($"NavigationPage/ViewA/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC/ViewA/ViewB"); //works
//NavigationService.NavigateAsync($"MyMasterDetail/NavigationPage/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC"); //works

//NavigationService.NavigateAsync($"NavigationPage/ViewA/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC");
//NavigationService.NavigateAsync($"NavigationPage/ViewA/MyTabbedPage/ViewA/ViewB/ViewC");
//NavigationService.NavigateAsync($"NavigationPage/ViewA/ViewB/NavigationPage?{KnownNavigationParameters.UseModalNavigation}=true/ViewB/ViewC");
//NavigationService.NavigateAsync($"NavigationPage/ViewA/ViewB/ViewC?{KnownNavigationParameters.UseModalNavigation}=true");
//NavigationService.NavigateAsync($"MyMasterDetail/NavigationPage/MyTabbedPage/ViewA/ViewC?{KnownNavigationParameters.UseModalNavigation}=true");
//NavigationService.NavigateAsync($"ViewA/ViewB/MyMasterDetail/NavigationPage/ViewA/ViewC");
//NavigationService.NavigateAsync($"ViewA/ViewB/MyMasterDetail/ViewA/ViewC");
//NavigationService.NavigateAsync($"ViewA/ViewB/MyMasterDetail/NavigationPage/ViewA/ViewB?{KnownNavigationParameters.UseModalNavigation}=true/ViewA/ViewC");
//NavigationService.NavigateAsync($"MyMasterDetail/NavigationPage/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC");
#endregion
public sealed partial class App
{
public App()
: this(null)
{

}

public App(IPlatformInitializer initializer)
: this(initializer, true)
{

}

public App(IPlatformInitializer initializer, bool setFormsDependencyResolver)
: base(initializer, setFormsDependencyResolver)
{

}

protected override void OnInitialized()
{
InitializeComponent();

//NavigationService.NavigateAsync("NavigationPage/MyTabbedPage"); //works
//NavigationService.NavigateAsync("NavigationPage/MyTabbedPage/ViewC"); //works
//NavigationService.NavigateAsync("NavigationPage/MyTabbedPage/ViewC/ViewA"); //works
//NavigationService.NavigateAsync("NavigationPage/ViewA/MyTabbedPage"); //works
//NavigationService.NavigateAsync("NavigationPage/ViewA/MyTabbedPage/ViewC"); //works
//NavigationService.NavigateAsync("NavigationPage/ViewA/MyTabbedPage/ViewC/ViewA/ViewB"); //works
//NavigationService.NavigateAsync("MyMasterDetail/NavigationPage/MyTabbedPage/ViewC"); //works

//NavigationService.NavigateAsync($"MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewA"); //works --
//NavigationService.NavigateAsync($"NavigationPage/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC"); //works
//NavigationService.NavigateAsync($"NavigationPage/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC"); //works
//NavigationService.NavigateAsync($"NavigationPage/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC/ViewA"); //works
//NavigationService.NavigateAsync($"NavigationPage/ViewA/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC"); //works
//NavigationService.NavigateAsync($"NavigationPage/ViewA/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC"); //works
//NavigationService.NavigateAsync($"NavigationPage/ViewA/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC/ViewA/ViewB"); //works
//NavigationService.NavigateAsync($"MyMasterDetail/NavigationPage/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC"); //works

//NavigationService.NavigateAsync($"NavigationPage/ViewA/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC/ViewC");
//NavigationService.NavigateAsync($"NavigationPage/ViewA/MyTabbedPage/ViewA/ViewB/ViewC");
//NavigationService.NavigateAsync($"NavigationPage/ViewA/ViewB/NavigationPage?{KnownNavigationParameters.UseModalNavigation}=true/ViewB/ViewC");
//NavigationService.NavigateAsync($"NavigationPage/ViewA/ViewB/ViewC?{KnownNavigationParameters.UseModalNavigation}=true");
//NavigationService.NavigateAsync($"MyMasterDetail/NavigationPage/MyTabbedPage/ViewA/ViewC?{KnownNavigationParameters.UseModalNavigation}=true");
//NavigationService.NavigateAsync($"ViewA/ViewB/MyMasterDetail/NavigationPage/ViewA/ViewC");
//NavigationService.NavigateAsync($"ViewA/ViewB/MyMasterDetail/ViewA/ViewC");
//NavigationService.NavigateAsync($"ViewA/ViewB/MyMasterDetail/NavigationPage/ViewA/ViewB?{KnownNavigationParameters.UseModalNavigation}=true/ViewA/ViewC");
//NavigationService.NavigateAsync($"MyMasterDetail/NavigationPage/MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewC");

NavigationService.NavigateAsync($"MyMasterDetail/MyTabbedPage");
NavigationService.NavigateAsync($"MyMasterDetail/MyTabbedPage").OnNavigationError(OnNavigationError);
}

private void OnNavigationError(Exception ex)
{

}

protected override void RegisterTypes(IContainerRegistry containerRegistry)
Expand Down
4 changes: 0 additions & 4 deletions e2e/Forms/src/HelloWorld/HelloWorld.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="3.6.0.344457" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\..\src\Forms\Prism.DryIoc.Forms\Prism.DryIoc.Forms.csproj" />
<ProjectReference Include="..\..\..\..\src\Forms\Prism.Forms\Prism.Forms.csproj" />
Expand Down
4 changes: 0 additions & 4 deletions e2e/Forms/src/ModuleA/ModuleA.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="3.6.0.344457" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\..\src\Forms\Prism.Forms\Prism.Forms.csproj" />
<ProjectReference Include="..\..\..\..\src\Prism.Core\Prism.Core.csproj" />
Expand Down
72 changes: 61 additions & 11 deletions src/Containers/Prism.DryIoc.Shared/DryIocContainerExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ internal partial
#endif
class DryIocContainerExtension : IContainerExtension<IContainer>, IContainerInfo
{
private IResolverContext _currentScope;
private DryIocScopedProvider _currentScope;

/// <summary>
/// Gets the Default DryIoc Container Rules used by Prism
Expand Down Expand Up @@ -57,6 +57,11 @@ public DryIocContainerExtension(IContainer container)
}
#endif

/// <summary>
/// Gets the current scope
/// </summary>
public IScopedProvider CurrentScope => _currentScope;

/// <summary>
/// Used to perform any final steps for configuring the extension that may be required by the container.
/// </summary>
Expand Down Expand Up @@ -284,7 +289,7 @@ public object Resolve(Type type, params (Type Type, object Instance)[] parameter
{
try
{
var container = _currentScope ?? Instance;
var container = _currentScope?.Resolver ?? Instance;
return container.Resolve(type, args: parameters.Select(p => p.Instance).ToArray());
}
catch (Exception ex)
Expand All @@ -304,7 +309,7 @@ public object Resolve(Type type, string name, params (Type Type, object Instance
{
try
{
var container = _currentScope ?? Instance;
var container = _currentScope?.Resolver ?? Instance;
return container.Resolve(type, name, args: parameters.Select(p => p.Instance).ToArray());
}
catch (Exception ex)
Expand Down Expand Up @@ -352,7 +357,7 @@ Type IContainerInfo.GetRegistrationType(Type serviceType)
/// <summary>
/// Creates a new Scope
/// </summary>
public virtual void CreateScope() =>
public virtual IScopedProvider CreateScope() =>
CreateScopeInternal();

/// <summary>
Expand All @@ -362,17 +367,62 @@ public virtual void CreateScope() =>
/// <remarks>
/// This should be called by custom implementations that Implement IServiceScopeFactory
/// </remarks>
protected IResolverContext CreateScopeInternal()
protected IScopedProvider CreateScopeInternal()
{
if (_currentScope != null)
var resolver = Instance.OpenScope();
_currentScope = new DryIocScopedProvider(resolver);
return _currentScope;
}

private class DryIocScopedProvider : IScopedProvider
{
public DryIocScopedProvider(IResolverContext resolver)
{
_currentScope.Dispose();
_currentScope = null;
GC.Collect();
Resolver = resolver;
}

_currentScope = Instance.OpenScope();
return _currentScope;
public bool IsAttached { get; set; }

public IResolverContext Resolver { get; private set; }
public IScopedProvider CurrentScope => this;

public IScopedProvider CreateScope() => this;

public void Dispose()
{
Resolver.Dispose();
Resolver = null;
}

public object Resolve(Type type) =>
Resolve(type, Array.Empty<(Type, object)>());

public object Resolve(Type type, string name) =>
Resolve(type, name, Array.Empty<(Type, object)>());

public object Resolve(Type type, params (Type Type, object Instance)[] parameters)
{
try
{
return Resolver.Resolve(type, args: parameters.Select(p => p.Instance).ToArray());
}
catch (Exception ex)
{
throw new ContainerResolutionException(type, ex);
}
}

public object Resolve(Type type, string name, params (Type Type, object Instance)[] parameters)
{
try
{
return Resolver.Resolve(type, name, args: parameters.Select(p => p.Instance).ToArray());
}
catch (Exception ex)
{
throw new ContainerResolutionException(type, name, ex);
}
}
}
}
}
Loading

0 comments on commit 6244391

Please sign in to comment.