mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-21 11:17:28 +08:00
Improving eager loading and caching for ContentDefinitionManager
--HG-- branch : 1.x
This commit is contained in:
@@ -9,7 +9,6 @@ using Orchard.ContentManagement.MetaData.Services;
|
||||
using Orchard.Core.Settings.Metadata.Records;
|
||||
using Orchard.Data;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Utility.Extensions;
|
||||
|
||||
namespace Orchard.Core.Settings.Metadata {
|
||||
public class ContentDefinitionManager : Component, IContentDefinitionManager {
|
||||
@@ -37,14 +36,20 @@ namespace Orchard.Core.Settings.Metadata {
|
||||
}
|
||||
|
||||
public ContentTypeDefinition GetTypeDefinition(string name) {
|
||||
return _cacheManager.Get(name ?? string.Empty, ctx => {
|
||||
MonitorContentDefinitionSignal(ctx);
|
||||
return _typeDefinitionRepository.Fetch(x => x.Name == name).Select(Build).SingleOrDefault();
|
||||
});
|
||||
if (String.IsNullOrWhiteSpace(name)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var contentTypeDefinitions = AcquireContentTypeDefinitions();
|
||||
if (contentTypeDefinitions.ContainsKey(name)) {
|
||||
return contentTypeDefinitions[name];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void DeleteTypeDefinition(string name) {
|
||||
var record = _typeDefinitionRepository.Fetch(x => x.Name == name).SingleOrDefault();
|
||||
var record = _typeDefinitionRepository.Table.SingleOrDefault(x => x.Name == name);
|
||||
|
||||
// deletes the content type record associated
|
||||
if (record != null) {
|
||||
@@ -64,7 +69,7 @@ namespace Orchard.Core.Settings.Metadata {
|
||||
}
|
||||
|
||||
// delete part
|
||||
var record = _partDefinitionRepository.Fetch(x => x.Name == name).SingleOrDefault();
|
||||
var record = _partDefinitionRepository.Table.SingleOrDefault(x => x.Name == name);
|
||||
|
||||
if (record != null) {
|
||||
_partDefinitionRepository.Delete(record);
|
||||
@@ -76,31 +81,28 @@ namespace Orchard.Core.Settings.Metadata {
|
||||
}
|
||||
|
||||
public ContentPartDefinition GetPartDefinition(string name) {
|
||||
return _cacheManager.Get(name ?? string.Empty, ctx => {
|
||||
MonitorContentDefinitionSignal(ctx);
|
||||
return _partDefinitionRepository.Fetch(x => x.Name == name).Select(Build).SingleOrDefault();
|
||||
});
|
||||
if (String.IsNullOrWhiteSpace(name)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var contentPartDefinitions = AcquireContentPartDefinitions();
|
||||
if (contentPartDefinitions.ContainsKey(name)) {
|
||||
return contentPartDefinitions[name];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public IEnumerable<ContentTypeDefinition> ListTypeDefinitions() {
|
||||
return _cacheManager.Get(string.Empty, ctx => {
|
||||
MonitorContentDefinitionSignal(ctx);
|
||||
return _typeDefinitionRepository.Fetch(x => !x.Hidden).Select(Build).ToReadOnlyCollection();
|
||||
});
|
||||
return AcquireContentTypeDefinitions().Values;
|
||||
}
|
||||
|
||||
public IEnumerable<ContentPartDefinition> ListPartDefinitions() {
|
||||
return _cacheManager.Get(string.Empty, ctx => {
|
||||
MonitorContentDefinitionSignal(ctx);
|
||||
return _partDefinitionRepository.Fetch(x => !x.Hidden).Select(Build).ToReadOnlyCollection();
|
||||
});
|
||||
return AcquireContentPartDefinitions().Values;
|
||||
}
|
||||
|
||||
public IEnumerable<ContentFieldDefinition> ListFieldDefinitions() {
|
||||
return _cacheManager.Get(string.Empty, ctx => {
|
||||
MonitorContentDefinitionSignal(ctx);
|
||||
return _fieldDefinitionRepository.Fetch(x => true, cfdr => cfdr.Asc(fdr => fdr.Name)).Select(Build).ToReadOnlyCollection();
|
||||
});
|
||||
return AcquireContentFieldDefinitions().Values;
|
||||
}
|
||||
|
||||
public void StoreTypeDefinition(ContentTypeDefinition contentTypeDefinition) {
|
||||
@@ -121,8 +123,44 @@ namespace Orchard.Core.Settings.Metadata {
|
||||
_signals.Trigger(ContentDefinitionSignal);
|
||||
}
|
||||
|
||||
private IDictionary<string, ContentTypeDefinition> AcquireContentTypeDefinitions() {
|
||||
return _cacheManager.Get("ContentTypeDefinitions", ctx => {
|
||||
MonitorContentDefinitionSignal(ctx);
|
||||
|
||||
var contentTypeDefinitionRecords = _typeDefinitionRepository.Table
|
||||
.FetchMany(x => x.ContentTypePartDefinitionRecords)
|
||||
.ThenFetch(x => x.ContentPartDefinitionRecord)
|
||||
.ThenFetchMany(x => x.ContentPartFieldDefinitionRecords)
|
||||
.ThenFetch(x => x.ContentFieldDefinitionRecord)
|
||||
.Select(Build);
|
||||
|
||||
return contentTypeDefinitionRecords.ToDictionary(x => x.Name, y => y );
|
||||
});
|
||||
}
|
||||
|
||||
private IDictionary<string, ContentPartDefinition> AcquireContentPartDefinitions() {
|
||||
return _cacheManager.Get("ContentPartDefinitions", ctx => {
|
||||
MonitorContentDefinitionSignal(ctx);
|
||||
|
||||
var contentTypeDefinitionRecords = _partDefinitionRepository.Table
|
||||
.FetchMany(x => x.ContentPartFieldDefinitionRecords)
|
||||
.ThenFetch(x => x.ContentFieldDefinitionRecord)
|
||||
.Select(Build);
|
||||
|
||||
return contentTypeDefinitionRecords.ToDictionary(x => x.Name, y => y);
|
||||
});
|
||||
}
|
||||
|
||||
private IDictionary<string, ContentFieldDefinition> AcquireContentFieldDefinitions() {
|
||||
return _cacheManager.Get("ContentFieldDefinitions", ctx => {
|
||||
MonitorContentDefinitionSignal(ctx);
|
||||
|
||||
return _fieldDefinitionRepository.Table.Select(Build).ToDictionary(x => x.Name, y => y);
|
||||
});
|
||||
}
|
||||
|
||||
private ContentTypeDefinitionRecord Acquire(ContentTypeDefinition contentTypeDefinition) {
|
||||
var result = _typeDefinitionRepository.Fetch(x => x.Name == contentTypeDefinition.Name).SingleOrDefault();
|
||||
var result = _typeDefinitionRepository.Table.SingleOrDefault(x => x.Name == contentTypeDefinition.Name);
|
||||
if (result == null) {
|
||||
result = new ContentTypeDefinitionRecord { Name = contentTypeDefinition.Name, DisplayName = contentTypeDefinition.DisplayName };
|
||||
_typeDefinitionRepository.Create(result);
|
||||
@@ -131,7 +169,7 @@ namespace Orchard.Core.Settings.Metadata {
|
||||
}
|
||||
|
||||
private ContentPartDefinitionRecord Acquire(ContentPartDefinition contentPartDefinition) {
|
||||
var result = _partDefinitionRepository.Fetch(x => x.Name == contentPartDefinition.Name).SingleOrDefault();
|
||||
var result = _partDefinitionRepository.Table.SingleOrDefault(x => x.Name == contentPartDefinition.Name);
|
||||
if (result == null) {
|
||||
result = new ContentPartDefinitionRecord { Name = contentPartDefinition.Name };
|
||||
_partDefinitionRepository.Create(result);
|
||||
@@ -140,7 +178,7 @@ namespace Orchard.Core.Settings.Metadata {
|
||||
}
|
||||
|
||||
private ContentFieldDefinitionRecord Acquire(ContentFieldDefinition contentFieldDefinition) {
|
||||
var result = _fieldDefinitionRepository.Fetch(x => x.Name == contentFieldDefinition.Name).SingleOrDefault();
|
||||
var result = _fieldDefinitionRepository.Table.SingleOrDefault(x => x.Name == contentFieldDefinition.Name);
|
||||
if (result == null) {
|
||||
result = new ContentFieldDefinitionRecord { Name = contentFieldDefinition.Name };
|
||||
_fieldDefinitionRepository.Create(result);
|
||||
@@ -153,7 +191,7 @@ namespace Orchard.Core.Settings.Metadata {
|
||||
record.Settings = _settingsFormatter.Map(model.Settings).ToString();
|
||||
|
||||
var toRemove = record.ContentTypePartDefinitionRecords
|
||||
.Where(partDefinitionRecord => !model.Parts.Any(part => partDefinitionRecord.ContentPartDefinitionRecord.Name == part.PartDefinition.Name))
|
||||
.Where(partDefinitionRecord => model.Parts.All(part => partDefinitionRecord.ContentPartDefinitionRecord.Name != part.PartDefinition.Name))
|
||||
.ToList();
|
||||
|
||||
foreach (var remove in toRemove) {
|
||||
@@ -179,7 +217,7 @@ namespace Orchard.Core.Settings.Metadata {
|
||||
record.Settings = _settingsFormatter.Map(model.Settings).ToString();
|
||||
|
||||
var toRemove = record.ContentPartFieldDefinitionRecords
|
||||
.Where(partFieldDefinitionRecord => !model.Fields.Any(partField => partFieldDefinitionRecord.Name == partField.Name))
|
||||
.Where(partFieldDefinitionRecord => model.Fields.All(partField => partFieldDefinitionRecord.Name != partField.Name))
|
||||
.ToList();
|
||||
|
||||
foreach (var remove in toRemove) {
|
||||
@@ -256,4 +294,5 @@ namespace Orchard.Core.Settings.Metadata {
|
||||
return map.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user