mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
PERF: ExtensionManager orders FeatureDescriptors inefficiently
Fix for 16717 --HG-- branch : perf
This commit is contained in:
@@ -86,8 +86,7 @@ namespace Orchard.Data.Migration {
|
||||
Logger.Information("Updating feature: {0}", feature);
|
||||
|
||||
// proceed with dependent features first, whatever the module it's in
|
||||
var dependencies = ShellStateCoordinator.OrderByDependencies(_extensionManager.AvailableExtensions()
|
||||
.SelectMany(ext => ext.Features))
|
||||
var dependencies = _extensionManager.AvailableFeatures()
|
||||
.Where(f => String.Equals(f.Name, feature, StringComparison.OrdinalIgnoreCase))
|
||||
.Where(f => f.Dependencies != null)
|
||||
.SelectMany( f => f.Dependencies )
|
||||
|
@@ -41,8 +41,7 @@ namespace Orchard.Data.Migration.Generator {
|
||||
/// Generates SchemaCommand instances in order to create the schema for a specific feature
|
||||
/// </summary>
|
||||
public IEnumerable<SchemaCommand> GetCreateFeatureCommands(string feature, bool drop) {
|
||||
var dependencies = ShellStateCoordinator.OrderByDependencies(_extensionManager.AvailableExtensions()
|
||||
.SelectMany(ext => ext.Features))
|
||||
var dependencies = _extensionManager.AvailableFeatures()
|
||||
.Where(f => String.Equals(f.Name, feature, StringComparison.OrdinalIgnoreCase))
|
||||
.Where(f => f.Dependencies != null)
|
||||
.SelectMany(f => f.Dependencies)
|
||||
|
@@ -4,7 +4,6 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using ICSharpCode.SharpZipLib.Zip;
|
||||
using Orchard.Environment.Descriptor.Models;
|
||||
using Orchard.Environment.Extensions.Folders;
|
||||
using Orchard.Environment.Extensions.Helpers;
|
||||
using Orchard.Environment.Extensions.Loaders;
|
||||
@@ -18,6 +17,7 @@ namespace Orchard.Environment.Extensions {
|
||||
public class ExtensionManager : IExtensionManager {
|
||||
private readonly IEnumerable<IExtensionFolders> _folders;
|
||||
private readonly IEnumerable<IExtensionLoader> _loaders;
|
||||
private IEnumerable<FeatureDescriptor> _featureDescriptors;
|
||||
|
||||
public Localizer T { get; set; }
|
||||
public ILogger Logger { get; set; }
|
||||
@@ -36,9 +36,11 @@ namespace Orchard.Environment.Extensions {
|
||||
}
|
||||
|
||||
public IEnumerable<FeatureDescriptor> AvailableFeatures() {
|
||||
var featureDescriptors = AvailableExtensions().SelectMany(ext => ext.Features);
|
||||
var featureDescriptorsOrdered = featureDescriptors.OrderByDependencies(HasDependency);
|
||||
return featureDescriptorsOrdered.ToReadOnlyCollection();
|
||||
if (_featureDescriptors == null || _featureDescriptors.Count() == 0) {
|
||||
_featureDescriptors = AvailableExtensions().SelectMany(ext => ext.Features).OrderByDependencies(HasDependency).ToReadOnlyCollection();
|
||||
return _featureDescriptors;
|
||||
}
|
||||
return _featureDescriptors;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@@ -7,7 +7,6 @@ using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Environment.State.Models;
|
||||
using Orchard.Environment.Descriptor;
|
||||
using Orchard.Environment.Descriptor.Models;
|
||||
using Orchard.Utility;
|
||||
|
||||
namespace Orchard.Environment.State {
|
||||
public class ShellStateCoordinator : IShellStateManagerEventHandler, IShellDescriptorManagerEventHandler {
|
||||
@@ -102,7 +101,7 @@ namespace Orchard.Environment.State {
|
||||
var shellState = _stateManager.GetShellState();
|
||||
|
||||
// start with description of all declared features in order - order preserved with all merging
|
||||
var orderedFeatureDescriptors = AllFeaturesInOrder();
|
||||
var orderedFeatureDescriptors = _extensionManager.AvailableFeatures();
|
||||
|
||||
// merge feature state into ordered list
|
||||
var orderedFeatureDescriptorsAndStates = orderedFeatureDescriptors
|
||||
@@ -176,19 +175,9 @@ namespace Orchard.Environment.State {
|
||||
FireApplyChangesIfNeeded();
|
||||
}
|
||||
|
||||
private IEnumerable<FeatureDescriptor> AllFeaturesInOrder() {
|
||||
return OrderByDependencies(_extensionManager.AvailableExtensions().SelectMany(ext => ext.Features));
|
||||
}
|
||||
|
||||
static bool IsRising(ShellFeatureState state) {
|
||||
return state.InstallState == ShellFeatureState.State.Rising ||
|
||||
state.EnableState == ShellFeatureState.State.Rising;
|
||||
}
|
||||
|
||||
public static IEnumerable<FeatureDescriptor> OrderByDependencies(IEnumerable<FeatureDescriptor> descriptors) {
|
||||
return descriptors.OrderByDependencies((item, dep) =>
|
||||
item.Dependencies != null &&
|
||||
item.Dependencies.Any(x => StringComparer.OrdinalIgnoreCase.Equals(x, dep.Name)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user