#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:
Andre Rodrigues
2011-05-24 12:34:27 -07:00
parent de6fc72d8e
commit 62c94648ec
3 changed files with 42 additions and 18 deletions

View File

@@ -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();
}
}
}
}

View File

@@ -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 };
}
}
}

View File

@@ -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;
});
}
}
}
}