Optimizing rendering

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros
2011-08-24 15:35:26 -07:00
parent d0f11de6e2
commit 3f73a0b938
19 changed files with 97 additions and 23 deletions

View File

@@ -38,6 +38,7 @@ namespace Orchard.Core.Tests.Body {
builder.RegisterType<OrchardServices>().As<IOrchardServices>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<ThingHandler>().As<IContentHandler>();

View File

@@ -66,6 +66,7 @@ namespace Orchard.Core.Tests.Common.Providers {
builder.RegisterInstance(new RequestContext(new StubHttpContext(), new RouteData()));
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterType<DefaultContentDisplay>().As<IContentDisplay>();

View File

@@ -54,6 +54,7 @@ namespace Orchard.Core.Tests.Routable.Services {
builder.RegisterType<RoutableService>().As<IRoutableService>();
builder.RegisterType<RoutablePathConstraint>().As<IRoutablePathConstraint>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterType<DefaultContentQuery>().As<IContentQuery>();

View File

@@ -36,6 +36,7 @@ namespace Orchard.Core.Tests.Scheduling {
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object);

View File

@@ -40,6 +40,7 @@ namespace Orchard.Core.Tests.Scheduling {
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object);

View File

@@ -70,6 +70,7 @@ namespace Orchard.Tests.Modules.Users.Controllers {
builder.RegisterType<TransactionManager>().As<ITransactionManager>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<StubExtensionManager>().As<IExtensionManager>();
builder.RegisterType<SiteSettingsPartHandler>().As<IContentHandler>();
builder.RegisterType<RegistrationSettingsPartHandler>().As<IContentHandler>();

View File

@@ -56,6 +56,7 @@ namespace Orchard.Tests.ContentManagement {
builder.RegisterType<FlavoredPartHandler>().As<IContentHandler>();
builder.RegisterType<StyledHandler>().As<IContentHandler>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));

View File

@@ -68,6 +68,7 @@ namespace Orchard.Tests.ContentManagement {
builder.RegisterType<FlavoredPartHandler>().As<IContentHandler>();
builder.RegisterType<StyledHandler>().As<IContentHandler>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterType<DefaultContentDisplay>().As<IContentDisplay>();

View File

@@ -27,6 +27,7 @@ namespace Orchard.Tests.DisplayManagement {
builder.RegisterType<DefaultDisplayManager>().As<IDisplayManager>();
builder.RegisterType<TestShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<TestWorkContextAccessor>().As<IWorkContextAccessor>();
builder.RegisterType<TestDisplayEvents>().As<IShapeDisplayEvents>()
.As<TestDisplayEvents>()

View File

@@ -10,7 +10,7 @@ using Orchard.Tests.Stubs;
namespace Orchard.Tests.DisplayManagement {
[TestFixture]
public class DefaultShapeBuilderTests {
public class ShapeFactoryTests {
private IContainer _container;
[SetUp]
@@ -18,6 +18,7 @@ namespace Orchard.Tests.DisplayManagement {
var builder = new ContainerBuilder();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<StubExtensionManager>().As<IExtensionManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<StubParallelCacheContext>().As<IParallelCacheContext>();

View File

@@ -17,6 +17,7 @@ namespace Orchard.Tests.DisplayManagement {
var builder = new ContainerBuilder();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<StubExtensionManager>().As<IExtensionManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<StubParallelCacheContext>().As<IParallelCacheContext>();

View File

@@ -43,6 +43,7 @@ namespace Orchard.Tests.DisplayManagement {
var builder = new ContainerBuilder();
builder.RegisterModule(new ShapeAttributeBindingModule());
builder.RegisterType<ShapeAttributeBindingStrategy>().As<IShapeTableProvider>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<DefaultDisplayManager>().As<IDisplayManager>();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterType<DisplayHelperFactory>().As<IDisplayHelperFactory>();

View File

@@ -84,6 +84,7 @@ namespace Orchard.Setup {
builder.RegisterType<DefaultDisplayManager>().As<IDisplayManager>();
builder.RegisterType<DefaultShapeFactory>().As<IShapeFactory>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();
builder.RegisterType<ThemeAwareViewEngine>().As<IThemeAwareViewEngine>();
builder.RegisterType<LayoutAwareViewEngine>().As<ILayoutAwareViewEngine>();

View File

@@ -8,32 +8,32 @@ using Orchard.DisplayManagement;
using Orchard.DisplayManagement.Descriptors;
using Orchard.FileSystems.VirtualPath;
using Orchard.Logging;
using Orchard.Themes;
using Orchard.UI.Zones;
namespace Orchard.ContentManagement {
public class DefaultContentDisplay : IContentDisplay {
private readonly Lazy<IEnumerable<IContentHandler>> _handlers;
private readonly IShapeFactory _shapeFactory;
private readonly IShapeTableManager _shapeTableManager;
private readonly Lazy<IThemeManager> _themeService;
private readonly Lazy<IShapeTableLocator> _shapeTableLocator;
private readonly RequestContext _requestContext;
private readonly IVirtualPathProvider _virtualPathProvider;
private readonly IWorkContextAccessor _workContextAccessor;
public DefaultContentDisplay(
Lazy<IEnumerable<IContentHandler>> handlers,
IShapeFactory shapeFactory,
IShapeTableManager shapeTableManager,
Lazy<IThemeManager> themeService,
Lazy<IShapeTableLocator> shapeTableLocator,
RequestContext requestContext,
IVirtualPathProvider virtualPathProvider) {
IVirtualPathProvider virtualPathProvider,
IWorkContextAccessor workContextAccessor) {
_handlers = handlers;
_shapeFactory = shapeFactory;
_shapeTableManager = shapeTableManager;
_themeService = themeService;
_shapeTableLocator = shapeTableLocator;
_requestContext = requestContext;
_virtualPathProvider = virtualPathProvider;
_workContextAccessor = workContextAccessor;
Logger = NullLogger.Instance;
}
@@ -106,8 +106,11 @@ namespace Orchard.ContentManagement {
private void BindPlacement(BuildShapeContext context, string displayType, string stereotype) {
context.FindPlacement = (partShapeType, differentiator, defaultLocation) => {
var theme = _themeService.Value.GetRequestTheme(_requestContext);
var shapeTable = _shapeTableManager.GetShapeTable(theme.Id);
var workContext = _workContextAccessor.GetContext(_requestContext.HttpContext);
var theme = workContext.CurrentTheme;
var shapeTable = _shapeTableLocator.Value.Lookup(theme.Id);
var request = _requestContext.HttpContext.Request;
ShapeDescriptor descriptor;

View File

@@ -15,7 +15,6 @@ using Orchard.ContentManagement.MetaData.Builders;
using Orchard.ContentManagement.MetaData.Models;
using Orchard.ContentManagement.Records;
using Orchard.Data;
using Orchard.Environment;
using Orchard.Indexing;
using Orchard.Logging;
using Orchard.UI;
@@ -29,7 +28,7 @@ namespace Orchard.ContentManagement {
private readonly IContentDefinitionManager _contentDefinitionManager;
private readonly Func<IContentManagerSession> _contentManagerSession;
private readonly Lazy<IContentDisplay> _contentDisplay;
private readonly Work<ISessionLocator> _sessionLocator;
private readonly Lazy<ISessionLocator> _sessionLocator;
private const string Published = "Published";
private const string Draft = "Draft";
@@ -41,7 +40,7 @@ namespace Orchard.ContentManagement {
IContentDefinitionManager contentDefinitionManager,
Func<IContentManagerSession> contentManagerSession,
Lazy<IContentDisplay> contentDisplay,
Work<ISessionLocator> sessionLocator) {
Lazy<ISessionLocator> sessionLocator) {
_context = context;
_contentTypeRepository = contentTypeRepository;
_contentItemRepository = contentItemRepository;

View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Concurrent;
namespace Orchard.DisplayManagement.Descriptors
{
/// <summary>
/// Will return the same shape table per name within the same unit of work.
/// Reduces compute costs compared to IShapeTableManager.GetShapeTable.
/// </summary>
public interface IShapeTableLocator : IUnitOfWorkDependency
{
ShapeTable Lookup(string themeName);
}
public class ShapeTableLocator : IShapeTableLocator
{
private readonly IShapeTableManager _shapeTableManager;
readonly ConcurrentDictionary<string, ShapeTable> _shapeTables = new ConcurrentDictionary<string, ShapeTable>();
public ShapeTableLocator(IShapeTableManager shapeTableManager)
{
_shapeTableManager = shapeTableManager;
}
public ShapeTable Lookup(string themeName)
{
return _shapeTables.GetOrAdd(themeName ?? "", _ => _shapeTableManager.GetShapeTable(themeName));
}
}
}

View File

@@ -13,7 +13,7 @@ using Orchard.Logging;
namespace Orchard.DisplayManagement.Implementation {
public class DefaultDisplayManager : IDisplayManager {
private readonly IShapeTableManager _shapeTableManager;
private readonly Lazy<IShapeTableLocator> _shapeTableLocator;
private readonly IWorkContextAccessor _workContextAccessor;
private readonly IEnumerable<IShapeDisplayEvents> _shapeDisplayEvents;
@@ -26,10 +26,10 @@ namespace Orchard.DisplayManagement.Implementation {
null/*typeof(DefaultDisplayManager)*/)));
public DefaultDisplayManager(
IShapeTableManager shapeTableManager,
IWorkContextAccessor workContextAccessor,
IEnumerable<IShapeDisplayEvents> shapeDisplayEvents) {
_shapeTableManager = shapeTableManager;
IEnumerable<IShapeDisplayEvents> shapeDisplayEvents,
Lazy<IShapeTableLocator> shapeTableLocator) {
_shapeTableLocator = shapeTableLocator;
_workContextAccessor = workContextAccessor;
_shapeDisplayEvents = shapeDisplayEvents;
T = NullLocalizer.Instance;
@@ -53,7 +53,7 @@ namespace Orchard.DisplayManagement.Implementation {
return CoerceHtmlString(context.Value);
var workContext = _workContextAccessor.GetContext(context.ViewContext);
var shapeTable = _shapeTableManager.GetShapeTable(workContext.CurrentTheme.Id);
var shapeTable = _shapeTableLocator.Value.Lookup(workContext.CurrentTheme.Id);
var displayingContext = new ShapeDisplayingContext {
Shape = shape,

View File

@@ -9,13 +9,14 @@ namespace Orchard.DisplayManagement.Implementation {
public class DefaultShapeFactory : Clay, IShapeFactory {
private readonly IEnumerable<Lazy<IShapeFactoryEvents>> _events;
private readonly IShapeTableManager _shapeTableManager;
private readonly Lazy<IShapeTableLocator> _shapeTableLocator;
public DefaultShapeFactory(
IEnumerable<Lazy<IShapeFactoryEvents>> events,
IShapeTableManager shapeTableManager) : base(new ShapeFactoryBehavior()) {
Lazy<IShapeTableLocator> shapeTableLocator) : base(new ShapeFactoryBehavior())
{
_events = events;
_shapeTableManager = shapeTableManager;
_shapeTableLocator = shapeTableLocator;
}
class ShapeFactoryBehavior : ClayBehavior {
@@ -29,7 +30,7 @@ namespace Orchard.DisplayManagement.Implementation {
}
public IShape Create(string shapeType, INamedEnumerable<object> parameters, IEnumerable<IClayBehavior> behaviors) {
var defaultShapeTable = _shapeTableManager.GetShapeTable(null);
var defaultShapeTable = _shapeTableLocator.Value.Lookup(null);
ShapeDescriptor shapeDescriptor;
defaultShapeTable.Descriptors.TryGetValue(shapeType, out shapeDescriptor);

View File

@@ -0,0 +1,27 @@
using System;
using Orchard.Mvc;
namespace Orchard.Themes
{
public class CurrentThemeWorkContext : IWorkContextStateProvider
{
private readonly IThemeManager _themeManager;
private readonly IHttpContextAccessor _httpContextAccessor;
public CurrentThemeWorkContext(IThemeManager themeManager, IHttpContextAccessor httpContextAccessor)
{
_themeManager = themeManager;
_httpContextAccessor = httpContextAccessor;
}
public Func<WorkContext, T> Get<T>(string name)
{
if (name == "CurrentTheme")
{
var currentTheme = _themeManager.GetRequestTheme(_httpContextAccessor.Current().Request.RequestContext);
return ctx => (T)(object)currentTheme;
}
return null;
}
}
}