From 5a0fe4e105be7031845f64338385fc0d0a233d8b Mon Sep 17 00:00:00 2001 From: Carl Woodhouse Date: Thu, 2 Feb 2017 20:23:07 +0000 Subject: [PATCH] [Fixes #5596] blueprint harvesting caching (#7549) Fixes #5596 --- .../Framework/Harvesters/HarvestElementsContext.cs | 1 + .../Providers/BlueprintElementHarvester.cs | 10 +++------- .../Services/DescribeElementsContext.cs | 1 + .../Modules/Orchard.Layouts/Services/ElementManager.cs | 3 ++- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Harvesters/HarvestElementsContext.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Harvesters/HarvestElementsContext.cs index c8cc7c230..a30249306 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Harvesters/HarvestElementsContext.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Harvesters/HarvestElementsContext.cs @@ -3,5 +3,6 @@ namespace Orchard.Layouts.Framework.Harvesters { public class HarvestElementsContext { public IContent Content { get; set; } + public bool IsHarvesting { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/BlueprintElementHarvester.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/BlueprintElementHarvester.cs index 3ca89574b..9d76467cf 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/BlueprintElementHarvester.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/BlueprintElementHarvester.cs @@ -13,7 +13,6 @@ namespace Orchard.Layouts.Providers { public class BlueprintElementHarvester : Component, IElementHarvester { private readonly Work _elementBlueprintService; private readonly Work _elementManager; - private bool _isHarvesting; public BlueprintElementHarvester(Work elementBlueprintService, Work elementManager) { _elementBlueprintService = elementBlueprintService; @@ -21,15 +20,14 @@ namespace Orchard.Layouts.Providers { } public IEnumerable HarvestElements(HarvestElementsContext context) { - if (_isHarvesting) + if (context.IsHarvesting) return Enumerable.Empty(); - _isHarvesting = true; var blueprints = _elementBlueprintService.Value.GetBlueprints().ToArray(); var query = from blueprint in blueprints - let describeContext = new DescribeElementsContext {Content = context.Content, CacheVaryParam = "Blueprints"} + let describeContext = new DescribeElementsContext {Content = context.Content, CacheVaryParam = "Blueprints", IsHarvesting = true } let baseElementDescriptor = _elementManager.Value.GetElementDescriptorByTypeName(describeContext, blueprint.BaseElementTypeName) let baseElement = _elementManager.Value.ActivateElement(baseElementDescriptor) select new ElementDescriptor( @@ -48,9 +46,7 @@ namespace Orchard.Layouts.Providers { } }; - var descriptors = query.ToArray(); - _isHarvesting = false; - return descriptors; + return query.ToArray(); } private static string GetCategory(ElementBlueprint blueprint) { diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Services/DescribeElementsContext.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Services/DescribeElementsContext.cs index 3a7f18f7a..42cb6fadf 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Services/DescribeElementsContext.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Services/DescribeElementsContext.cs @@ -4,6 +4,7 @@ namespace Orchard.Layouts.Services { public class DescribeElementsContext { public IContent Content { get; set; } public string CacheVaryParam { get; set; } + public bool IsHarvesting { get; set; } public static readonly DescribeElementsContext Empty = new DescribeElementsContext(); } diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs index 1281f5d85..5e0146250 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs @@ -40,7 +40,8 @@ namespace Orchard.Layouts.Services { var cacheKey = String.Format("LayoutElementTypes-{0}-{1}", contentType ?? "AnyType", context.CacheVaryParam); return _cacheManager.Get(cacheKey, true, acquireContext => { var harvesterContext = new HarvestElementsContext { - Content = context.Content + Content = context.Content, + IsHarvesting = context.IsHarvesting }; var query = from harvester in _elementHarvesters.Value