From 8818202fcf4c8f8031a39f7cc2727e7da8cd194d Mon Sep 17 00:00:00 2001 From: Lombiq Date: Wed, 10 Sep 2014 17:28:54 +0200 Subject: [PATCH] #20922: Optimizing Alias lookups by using the in-memory AliasMap Work Item: 20922 --- .../Implementation/DefaultAliasService.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs index ccf809791..fb1be8a4f 100644 --- a/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs +++ b/src/Orchard.Web/Modules/Orchard.Alias/Implementation/DefaultAliasService.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.Linq; using System.Web; using System.Web.Routing; +using Orchard.Alias.Implementation.Holder; using Orchard.Alias.Implementation.Storage; using Orchard.Mvc.Routes; using Orchard.Utility.Extensions; @@ -13,12 +14,15 @@ namespace Orchard.Alias.Implementation { private readonly IAliasStorage _aliasStorage; private readonly IEnumerable _routeProviders; private readonly Lazy> _routeDescriptors; + private readonly IAliasHolder _aliasHolder; public DefaultAliasService( IAliasStorage aliasStorage, - IEnumerable routeProviders) { + IEnumerable routeProviders, + IAliasHolder aliasHolder) { _aliasStorage = aliasStorage; _routeProviders = routeProviders; + _aliasHolder = aliasHolder; _routeDescriptors = new Lazy>(GetRouteDescriptors); } @@ -79,7 +83,14 @@ namespace Orchard.Alias.Implementation { } public IEnumerable Lookup(RouteValueDictionary routeValues) { - return List().Where(item => item.Item2.Match(routeValues)).Select(item=>item.Item1).ToList(); + if (routeValues.ContainsKey("area")) { + var map = _aliasHolder.GetMap(routeValues["area"].ToString()); + if (map == null) { + return Enumerable.Empty(); + } + return new[] { map.Locate(routeValues).Item2 }; + } + return _aliasHolder.GetMaps().Where(map => map.Locate(routeValues) != null).Select(map => map.Locate(routeValues).Item2); } public IEnumerable> List() {