From 65db8d7f072cc86d6a51588ffa1750bd83c23adc Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sun, 16 May 2010 18:40:15 -0700 Subject: [PATCH] Perf: lazy-loading for ContentPart.Record property Content item parts that are not referenced do not need to acquire their data --HG-- branch : dev --- src/Orchard/ContentManagement/ContentPart.cs | 5 +++- .../Handlers/StorageFilter.cs | 27 +++++++++---------- .../Handlers/StorageVersionFilter.cs | 13 ++++----- src/Orchard/Orchard.Framework.csproj | 1 + 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/Orchard/ContentManagement/ContentPart.cs b/src/Orchard/ContentManagement/ContentPart.cs index 1b56b8fc1..180ea362f 100644 --- a/src/Orchard/ContentManagement/ContentPart.cs +++ b/src/Orchard/ContentManagement/ContentPart.cs @@ -1,10 +1,13 @@ +using Orchard.ContentManagement.Utilities; + namespace Orchard.ContentManagement { public abstract class ContentPart : IContent { public virtual ContentItem ContentItem { get; set; } } public class ContentPart : ContentPart { - public TRecord Record { get; set; } + public readonly LazyField _record = new LazyField(); + public TRecord Record { get { return _record.Value; } set { _record.Value = value; } } } } diff --git a/src/Orchard/ContentManagement/Handlers/StorageFilter.cs b/src/Orchard/ContentManagement/Handlers/StorageFilter.cs index 2abdc5efe..b6411f730 100644 --- a/src/Orchard/ContentManagement/Handlers/StorageFilter.cs +++ b/src/Orchard/ContentManagement/Handlers/StorageFilter.cs @@ -26,6 +26,16 @@ namespace Orchard.ContentManagement.Handlers { _repository = repository; } + protected virtual TRecord GetRecordCore(ContentItemVersionRecord versionRecord) { + return _repository.Get(versionRecord.ContentItemRecord.Id); + } + + protected virtual TRecord CreateRecordCore(ContentItemVersionRecord versionRecord, TRecord record) { + record.ContentItemRecord = versionRecord.ContentItemRecord; + _repository.Create(record); + return record; + } + protected override void Activated(ActivatedContentContext context, ContentPart instance) { if (instance.Record != null) { throw new InvalidOperationException(string.Format( @@ -36,23 +46,12 @@ namespace Orchard.ContentManagement.Handlers { } protected override void Creating(CreateContentContext context, ContentPart instance) { - instance.Record.ContentItemRecord = context.ContentItemRecord; - _repository.Create(instance.Record); - } - - protected virtual TRecord GetRecord(LoadContentContext context) { - return _repository.Get(context.Id); + CreateRecordCore(context.ContentItemVersionRecord, instance.Record); } protected override void Loading(LoadContentContext context, ContentPart instance) { - var record = GetRecord(context); - if (record != null) { - instance.Record = record; - } - else { - var createContext = new CreateContentContext(context.ContentItem); - Creating(createContext, instance); - } + var versionRecord = context.ContentItemVersionRecord; + instance._record.Loader(prior => GetRecordCore(versionRecord) ?? CreateRecordCore(versionRecord, prior)); } protected override void Versioning(VersionContentContext context, ContentPart existing, ContentPart building) { diff --git a/src/Orchard/ContentManagement/Handlers/StorageVersionFilter.cs b/src/Orchard/ContentManagement/Handlers/StorageVersionFilter.cs index e7247fd4a..2ac987351 100644 --- a/src/Orchard/ContentManagement/Handlers/StorageVersionFilter.cs +++ b/src/Orchard/ContentManagement/Handlers/StorageVersionFilter.cs @@ -7,14 +7,15 @@ namespace Orchard.ContentManagement.Handlers { : base(repository) { } - protected override TRecord GetRecord(LoadContentContext context) { - return _repository.Get(context.ContentItemVersionRecord.Id); + protected override TRecord GetRecordCore(ContentItemVersionRecord versionRecord) { + return _repository.Get(versionRecord.Id); } - protected override void Creating(CreateContentContext context, ContentPart instance) { - instance.Record.ContentItemRecord = context.ContentItemRecord; - instance.Record.ContentItemVersionRecord = context.ContentItemVersionRecord; - _repository.Create(instance.Record); + protected override TRecord CreateRecordCore(ContentItemVersionRecord versionRecord, TRecord record) { + record.ContentItemRecord = versionRecord.ContentItemRecord; + record.ContentItemVersionRecord = versionRecord; + _repository.Create(record); + return record; } protected override void Versioning(VersionContentContext context, ContentPart existing, ContentPart building) { diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 10028f1dc..62227f8d3 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -152,6 +152,7 @@ +