mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-24 18:25:04 +08:00
Removes IDisplayedContentItemHandler in favour of ICacheTagProvider (#7793)
Fixes #7792
This commit is contained in:
committed by
Sébastien Ros
parent
5ce43b6827
commit
7373c11a1e
@@ -20,7 +20,6 @@ using Orchard.OutputCache.Helpers;
|
|||||||
using Orchard.OutputCache.Models;
|
using Orchard.OutputCache.Models;
|
||||||
using Orchard.OutputCache.Services;
|
using Orchard.OutputCache.Services;
|
||||||
using Orchard.Services;
|
using Orchard.Services;
|
||||||
using Orchard.Themes;
|
|
||||||
using Orchard.UI.Admin;
|
using Orchard.UI.Admin;
|
||||||
using Orchard.Utility.Extensions;
|
using Orchard.Utility.Extensions;
|
||||||
|
|
||||||
@@ -33,14 +32,12 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
// Dependencies.
|
// Dependencies.
|
||||||
private readonly ICacheManager _cacheManager;
|
private readonly ICacheManager _cacheManager;
|
||||||
private readonly IOutputCacheStorageProvider _cacheStorageProvider;
|
private readonly IOutputCacheStorageProvider _cacheStorageProvider;
|
||||||
private readonly ITagCache _tagCache;
|
|
||||||
private readonly IDisplayedContentItemHandler _displayedContentItemHandler;
|
|
||||||
private readonly IWorkContextAccessor _workContextAccessor;
|
private readonly IWorkContextAccessor _workContextAccessor;
|
||||||
private readonly IThemeManager _themeManager;
|
|
||||||
private readonly IClock _clock;
|
private readonly IClock _clock;
|
||||||
private readonly ICacheService _cacheService;
|
private readonly ICacheService _cacheService;
|
||||||
private readonly ISignals _signals;
|
private readonly ISignals _signals;
|
||||||
private readonly ShellSettings _shellSettings;
|
private readonly ShellSettings _shellSettings;
|
||||||
|
private readonly IEnumerable<ICacheTagProvider> _cacheTagProviders;
|
||||||
private readonly ICachingEventHandler _cachingEvents;
|
private readonly ICachingEventHandler _cachingEvents;
|
||||||
private bool _isDisposed = false;
|
private bool _isDisposed = false;
|
||||||
|
|
||||||
@@ -49,26 +46,22 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
public OutputCacheFilter(
|
public OutputCacheFilter(
|
||||||
ICacheManager cacheManager,
|
ICacheManager cacheManager,
|
||||||
IOutputCacheStorageProvider cacheStorageProvider,
|
IOutputCacheStorageProvider cacheStorageProvider,
|
||||||
ITagCache tagCache,
|
|
||||||
IDisplayedContentItemHandler displayedContentItemHandler,
|
|
||||||
IWorkContextAccessor workContextAccessor,
|
IWorkContextAccessor workContextAccessor,
|
||||||
IThemeManager themeManager,
|
|
||||||
IClock clock,
|
IClock clock,
|
||||||
ICacheService cacheService,
|
ICacheService cacheService,
|
||||||
ISignals signals,
|
ISignals signals,
|
||||||
ShellSettings shellSettings,
|
ShellSettings shellSettings,
|
||||||
|
IEnumerable<ICacheTagProvider> cacheTagProviders,
|
||||||
ICachingEventHandler cachingEvents) {
|
ICachingEventHandler cachingEvents) {
|
||||||
|
|
||||||
_cacheManager = cacheManager;
|
_cacheManager = cacheManager;
|
||||||
_cacheStorageProvider = cacheStorageProvider;
|
_cacheStorageProvider = cacheStorageProvider;
|
||||||
_tagCache = tagCache;
|
|
||||||
_displayedContentItemHandler = displayedContentItemHandler;
|
|
||||||
_workContextAccessor = workContextAccessor;
|
_workContextAccessor = workContextAccessor;
|
||||||
_themeManager = themeManager;
|
|
||||||
_clock = clock;
|
_clock = clock;
|
||||||
_cacheService = cacheService;
|
_cacheService = cacheService;
|
||||||
_signals = signals;
|
_signals = signals;
|
||||||
_shellSettings = shellSettings;
|
_shellSettings = shellSettings;
|
||||||
|
_cacheTagProviders = cacheTagProviders;
|
||||||
_cachingEvents = cachingEvents;
|
_cachingEvents = cachingEvents;
|
||||||
|
|
||||||
Logger = NullLogger.Instance;
|
Logger = NullLogger.Instance;
|
||||||
@@ -206,8 +199,17 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
var cacheDuration = _cacheRouteConfig != null && _cacheRouteConfig.Duration.HasValue ? _cacheRouteConfig.Duration.Value : CacheSettings.DefaultCacheDuration;
|
var cacheDuration = _cacheRouteConfig != null && _cacheRouteConfig.Duration.HasValue ? _cacheRouteConfig.Duration.Value : CacheSettings.DefaultCacheDuration;
|
||||||
var cacheGraceTime = _cacheRouteConfig != null && _cacheRouteConfig.GraceTime.HasValue ? _cacheRouteConfig.GraceTime.Value : CacheSettings.DefaultCacheGraceTime;
|
var cacheGraceTime = _cacheRouteConfig != null && _cacheRouteConfig.GraceTime.HasValue ? _cacheRouteConfig.GraceTime.Value : CacheSettings.DefaultCacheGraceTime;
|
||||||
|
|
||||||
// Include each content item ID as tags for the cache entry.
|
// Get the tags for this cache item from.
|
||||||
var contentItemIds = _displayedContentItemHandler.GetDisplayed().Select(x => x.ToString(CultureInfo.InvariantCulture)).ToArray();
|
var cacheItemTags = new List<string>();
|
||||||
|
|
||||||
|
foreach (var cacheTagProvider in _cacheTagProviders) {
|
||||||
|
try {
|
||||||
|
cacheItemTags.AddRange(cacheTagProvider.GetTags());
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
Logger.Warning(ex, "Cache tags from provider {0} will not be added to the cached item ({1}) because the provider threw an exception when asked to provide tags.", cacheTagProvider.GetType().FullName, _cacheKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Capture the response output using a custom filter stream.
|
// Capture the response output using a custom filter stream.
|
||||||
var response = filterContext.HttpContext.Response;
|
var response = filterContext.HttpContext.Response;
|
||||||
@@ -248,7 +250,7 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
Url = filterContext.HttpContext.Request.Url.AbsolutePath,
|
Url = filterContext.HttpContext.Request.Url.AbsolutePath,
|
||||||
Tenant = scope.Resolve<ShellSettings>().Name,
|
Tenant = scope.Resolve<ShellSettings>().Name,
|
||||||
StatusCode = response.StatusCode,
|
StatusCode = response.StatusCode,
|
||||||
Tags = new[] { _invariantCacheKey }.Union(contentItemIds).ToArray(),
|
Tags = new[] { _invariantCacheKey }.Union(cacheItemTags.Distinct()).ToArray(),
|
||||||
ETag = etag
|
ETag = etag
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +1,23 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Orchard.OutputCache.Services;
|
using Orchard.OutputCache.Services;
|
||||||
using Orchard.ContentManagement.Handlers;
|
using Orchard.ContentManagement.Handlers;
|
||||||
|
|
||||||
namespace Orchard.OutputCache.Handlers {
|
namespace Orchard.OutputCache.Handlers {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Saves references to content items which have been displayed during a request
|
/// Creates tags for content items which have been displayed during a request
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DisplayedContentItemHandler : ContentHandler, IDisplayedContentItemHandler {
|
public class DisplayedContentCacheTagProvider : ContentHandler, ICacheTagProvider {
|
||||||
private readonly Collection<int> _itemIds = new Collection<int>();
|
private readonly Collection<int> _itemIds = new Collection<int>();
|
||||||
|
|
||||||
protected override void BuildDisplayShape(BuildDisplayContext context) {
|
protected override void BuildDisplayShape(BuildDisplayContext context) {
|
||||||
_itemIds.Add(context.Content.Id);
|
_itemIds.Add(context.Content.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsDisplayed(int id) {
|
public IEnumerable<string> GetTags() {
|
||||||
return _itemIds.Contains(id);
|
return _itemIds.Distinct().Select(id => id.ToString(CultureInfo.InvariantCulture));
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<int> GetDisplayed() {
|
|
||||||
return _itemIds.Distinct();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,5 @@
|
|||||||
using Orchard.Events;
|
using Orchard.Events;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Web;
|
|
||||||
|
|
||||||
namespace Orchard.OutputCache {
|
namespace Orchard.OutputCache {
|
||||||
public interface ICachingEventHandler : IEventHandler {
|
public interface ICachingEventHandler : IEventHandler {
|
||||||
|
|||||||
@@ -128,7 +128,7 @@
|
|||||||
<Compile Include="Filters\CaptureStream.cs" />
|
<Compile Include="Filters\CaptureStream.cs" />
|
||||||
<Compile Include="Filters\OutputCacheFilter.cs" />
|
<Compile Include="Filters\OutputCacheFilter.cs" />
|
||||||
<Compile Include="Handlers\CacheSettingsPartHandler.cs" />
|
<Compile Include="Handlers\CacheSettingsPartHandler.cs" />
|
||||||
<Compile Include="Handlers\DisplayedContentItemHandler.cs" />
|
<Compile Include="Handlers\DisplayedContentCacheTagProvider.cs" />
|
||||||
<Compile Include="DatabaseOutputCacheMigrations.cs" />
|
<Compile Include="DatabaseOutputCacheMigrations.cs" />
|
||||||
<Compile Include="Helpers\OutputCacheAttributeExtensions.cs" />
|
<Compile Include="Helpers\OutputCacheAttributeExtensions.cs" />
|
||||||
<Compile Include="Migrations.cs" />
|
<Compile Include="Migrations.cs" />
|
||||||
@@ -144,7 +144,7 @@
|
|||||||
<Compile Include="Services\DefaultCacheControlStrategy.cs" />
|
<Compile Include="Services\DefaultCacheControlStrategy.cs" />
|
||||||
<Compile Include="Services\DefaultTagCache.cs" />
|
<Compile Include="Services\DefaultTagCache.cs" />
|
||||||
<Compile Include="Services\ICacheControlStrategy.cs" />
|
<Compile Include="Services\ICacheControlStrategy.cs" />
|
||||||
<Compile Include="Services\IDisplayedContentItemHandler.cs" />
|
<Compile Include="Services\ICacheTagProvider.cs" />
|
||||||
<Compile Include="Services\ITagCache.cs" />
|
<Compile Include="Services\ITagCache.cs" />
|
||||||
<Compile Include="Services\DefaultCacheStorageProvider.cs" />
|
<Compile Include="Services\DefaultCacheStorageProvider.cs" />
|
||||||
<Compile Include="Services\ICacheService.cs" />
|
<Compile Include="Services\ICacheService.cs" />
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Orchard.OutputCache.Services {
|
||||||
|
public interface ICacheTagProvider : IDependency {
|
||||||
|
IEnumerable<string> GetTags();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using Orchard;
|
|
||||||
|
|
||||||
namespace Orchard.OutputCache.Services {
|
|
||||||
public interface IDisplayedContentItemHandler : IDependency {
|
|
||||||
bool IsDisplayed(int id);
|
|
||||||
IEnumerable<int> GetDisplayed();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user