mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
#17816: Caching current theme name as a way to avoid up to 2 queries per request.
--HG-- branch : 1.x
This commit is contained in:
@@ -128,8 +128,7 @@ Features:
|
||||
Assert.Throws(typeof(InvalidOperationException), () => themeRecipeHandler.ExecuteRecipeStep(recipeContext));
|
||||
}
|
||||
|
||||
internal class StubSiteThemeService : ISiteThemeService
|
||||
{
|
||||
internal class StubSiteThemeService : ISiteThemeService {
|
||||
public ExtensionDescriptor GetSiteTheme() {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
@@ -137,6 +136,10 @@ Features:
|
||||
public void SetSiteTheme(string themeName) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public string GetCurrentThemeName() {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,19 @@
|
||||
using System;
|
||||
using System.Web.Routing;
|
||||
using JetBrains.Annotations;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.Themes.Models;
|
||||
|
||||
namespace Orchard.Themes.Services {
|
||||
[UsedImplicitly]
|
||||
public class SiteThemeSelector : IThemeSelector {
|
||||
private readonly IOrchardServices _orchardServices;
|
||||
private readonly ISiteThemeService _siteThemeService;
|
||||
|
||||
public SiteThemeSelector(IOrchardServices orchardServices) {
|
||||
_orchardServices = orchardServices;
|
||||
public SiteThemeSelector(ISiteThemeService siteThemeService) {
|
||||
_siteThemeService = siteThemeService;
|
||||
}
|
||||
|
||||
public ThemeSelectorResult GetTheme(RequestContext context) {
|
||||
string currentThemeName = _orchardServices.WorkContext.CurrentSite.As<ThemeSiteSettingsPart>().Record.CurrentThemeName;
|
||||
|
||||
string currentThemeName = _siteThemeService.GetCurrentThemeName();
|
||||
return String.IsNullOrEmpty(currentThemeName) ? null : new ThemeSelectorResult { Priority = -5, ThemeName = currentThemeName };
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.Caching;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Localization;
|
||||
@@ -9,31 +10,55 @@ namespace Orchard.Themes.Services {
|
||||
public interface ISiteThemeService : IDependency {
|
||||
ExtensionDescriptor GetSiteTheme();
|
||||
void SetSiteTheme(string themeName);
|
||||
string GetCurrentThemeName();
|
||||
}
|
||||
|
||||
public class SiteThemeService : ISiteThemeService {
|
||||
public const string CurrentThemeSignal = "SiteCurrentTheme";
|
||||
|
||||
private readonly IExtensionManager _extensionManager;
|
||||
private readonly IWorkContextAccessor _workContextAccessor;
|
||||
private readonly ICacheManager _cacheManager;
|
||||
private readonly ISignals _signals;
|
||||
private readonly IOrchardServices _orchardServices;
|
||||
|
||||
public SiteThemeService(IExtensionManager extensionManager, IWorkContextAccessor workContextAccessor) {
|
||||
public SiteThemeService(
|
||||
IOrchardServices orchardServices,
|
||||
IExtensionManager extensionManager,
|
||||
IWorkContextAccessor workContextAccessor,
|
||||
ICacheManager cacheManager,
|
||||
ISignals signals) {
|
||||
|
||||
_orchardServices = orchardServices;
|
||||
_extensionManager = extensionManager;
|
||||
_workContextAccessor = workContextAccessor;
|
||||
_cacheManager = cacheManager;
|
||||
_signals = signals;
|
||||
|
||||
Logger = NullLogger.Instance;
|
||||
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
public Localizer T { get; set; }
|
||||
public ILogger Logger { get; set; }
|
||||
|
||||
public ExtensionDescriptor GetSiteTheme() {
|
||||
var site = _workContextAccessor.GetContext().CurrentSite;
|
||||
string currentThemeName = site.As<ThemeSiteSettingsPart>().CurrentThemeName;
|
||||
|
||||
return string.IsNullOrEmpty(currentThemeName) ? null : _extensionManager.GetExtension(currentThemeName);
|
||||
string currentThemeName = GetCurrentThemeName();
|
||||
return string.IsNullOrEmpty(currentThemeName) ? null : _extensionManager.GetExtension(GetCurrentThemeName());
|
||||
}
|
||||
|
||||
public void SetSiteTheme(string themeName) {
|
||||
var site = _workContextAccessor.GetContext().CurrentSite;
|
||||
site.As<ThemeSiteSettingsPart>().Record.CurrentThemeName = themeName;
|
||||
site.As<ThemeSiteSettingsPart>().CurrentThemeName = themeName;
|
||||
|
||||
_signals.Trigger(CurrentThemeSignal);
|
||||
}
|
||||
|
||||
public string GetCurrentThemeName() {
|
||||
return _cacheManager.Get("CurrentThemeName", ctx => {
|
||||
ctx.Monitor(_signals.When(CurrentThemeSignal));
|
||||
return _orchardServices.WorkContext.CurrentSite.As<ThemeSiteSettingsPart>().CurrentThemeName;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user