From ee20851ecbd0b2bf383386fd3f34c827e66cf6bb Mon Sep 17 00:00:00 2001 From: Brian Lagunas Date: Wed, 4 Mar 2020 17:44:39 -0700 Subject: [PATCH] added RegiserMappings generic method --- .../Regions/RegionAdapterMappingsFixture.cs | 42 ++++++++++++++++++- .../Regions/RegionAdapterMappings.cs | 36 +++++++++++++++- 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/Source/Wpf/Prism.Wpf.Tests/Regions/RegionAdapterMappingsFixture.cs b/Source/Wpf/Prism.Wpf.Tests/Regions/RegionAdapterMappingsFixture.cs index 42987ccf5e..0b9b6b29d5 100644 --- a/Source/Wpf/Prism.Wpf.Tests/Regions/RegionAdapterMappingsFixture.cs +++ b/Source/Wpf/Prism.Wpf.Tests/Regions/RegionAdapterMappingsFixture.cs @@ -6,6 +6,7 @@ using Xunit; using Prism.Regions; using Prism.Wpf.Tests.Mocks; +using CommonServiceLocator; namespace Prism.Wpf.Tests.Regions { @@ -26,6 +27,46 @@ public void ShouldGetRegisteredMapping() Assert.Same(regionAdapter, returnedAdapter); } + [Fact] + public void ShouldGetRegisteredMapping_UsingGenericControl() + { + var regionAdapterMappings = new RegionAdapterMappings(); + var regionAdapter = new MockRegionAdapter(); + + regionAdapterMappings.RegisterMapping(regionAdapter); + + var returnedAdapter = regionAdapterMappings.GetMapping(); + + Assert.NotNull(returnedAdapter); + Assert.Same(regionAdapter, returnedAdapter); + } + + [Fact] + public void ShouldGetRegisteredMapping_UsingGenericControlAndAdapter() + { + try + { + var regionAdapterMappings = new RegionAdapterMappings(); + var regionAdapter = new MockRegionAdapter(); + + ServiceLocator.SetLocatorProvider(() => new MockServiceLocator + { + GetInstance = t => regionAdapter + }); + + regionAdapterMappings.RegisterMapping(); + + var returnedAdapter = regionAdapterMappings.GetMapping(); + + Assert.NotNull(returnedAdapter); + Assert.Same(regionAdapter, returnedAdapter); + } + finally + { + ServiceLocator.SetLocatorProvider(null); + } + } + [Fact] public void ShouldGetMappingForDerivedTypesThanTheRegisteredOnes() { @@ -76,7 +117,6 @@ public void RegisterAMappingThatAlreadyExistsThrows() regionAdapterMappings.RegisterMapping(typeof(ItemsControl), regionAdapter); regionAdapterMappings.RegisterMapping(typeof(ItemsControl), regionAdapter); }); - } [Fact] diff --git a/Source/Wpf/Prism.Wpf/Regions/RegionAdapterMappings.cs b/Source/Wpf/Prism.Wpf/Regions/RegionAdapterMappings.cs index ae87df1b59..b64bb14e26 100644 --- a/Source/Wpf/Prism.Wpf/Regions/RegionAdapterMappings.cs +++ b/Source/Wpf/Prism.Wpf/Regions/RegionAdapterMappings.cs @@ -1,5 +1,3 @@ - - using Prism.Properties; using System; using System.Collections.Generic; @@ -36,6 +34,25 @@ public void RegisterMapping(Type controlType, IRegionAdapter adapter) mappings.Add(controlType, adapter); } + /// + /// Registers the mapping between a type and an adapter. + /// + /// The type of the control + public void RegisterMapping(IRegionAdapter adapter) + { + RegisterMapping(typeof(TControl), adapter); + } + + /// + /// Registers the mapping between a type and an adapter. + /// + /// The type of the control + /// The type of the IRegionAdapter to use with the TControl + public void RegisterMapping() where TAdapter : IRegionAdapter + { + RegisterMapping(typeof(TControl), (IRegionAdapter)CommonServiceLocator.ServiceLocator.Current.GetInstance(typeof(TAdapter))); + } + /// /// Returns the adapter associated with the type provided. /// @@ -61,5 +78,20 @@ public IRegionAdapter GetMapping(Type controlType) } throw new KeyNotFoundException(String.Format(CultureInfo.CurrentCulture, Resources.NoRegionAdapterException, controlType)); } + + /// + /// Returns the adapter associated with the type provided. + /// + /// The control type used to obtain the mapped. + /// The mapped to the . + /// This class will look for a registered type for and if there is not any, + /// it will look for a registered type for any of its ancestors in the class hierarchy. + /// If there is no registered type for or any of its ancestors, + /// an exception will be thrown. + /// When there is no registered type for or any of its ancestors. + public IRegionAdapter GetMapping() + { + return GetMapping(typeof(T)); + } } } \ No newline at end of file