mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Optimizing rendering
--HG-- branch : 1.x
This commit is contained in:
@@ -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>();
|
||||
|
||||
|
@@ -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>();
|
||||
|
||||
|
@@ -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>();
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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>();
|
||||
|
@@ -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<>));
|
||||
|
@@ -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>();
|
||||
|
||||
|
@@ -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>()
|
||||
|
@@ -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>();
|
||||
|
@@ -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>();
|
||||
|
@@ -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>();
|
||||
|
@@ -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>();
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
@@ -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,
|
||||
|
@@ -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);
|
||||
|
||||
|
27
src/Orchard/Themes/CurrentThemeWorkContext.cs
Normal file
27
src/Orchard/Themes/CurrentThemeWorkContext.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user