mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Incremental improvement to extension manager
--HG-- branch : perf extra : rebase_source : f2697bf60ab12c79e848e1794652e19ac5933d3a
This commit is contained in:
@@ -1,3 +1 @@
|
|||||||
setup /SiteName:Profiling /AdminUsername:admin /AdminPassword:profiling-secret /DatabaseProvider:SqlCe /EnabledFeatures:Profiling,Orchard.Framework,Routable,Common,Dashboard,Feeds,Orchard.PublishLater,HomePage,Contents,Messaging,Navigation,Reports,Scheduling,Indexing,Settings,Localization,XmlRpc,Orchard.Users,Orchard.Roles,TinyMce,Orchard.Themes,Orchard.MultiTenancy,Orchard.Blogs,Orchard.Comments,Orchard.Modules,Orchard.Widgets,Orchard.Media,Orchard.Tags,Orchard.Experimental
|
setup /SiteName:Profiling /AdminUsername:admin /AdminPassword:profiling-secret /DatabaseProvider:SqlCe /EnabledFeatures:Profiling,Orchard.Framework,Routable,Common,Dashboard,Feeds,Orchard.PublishLater,HomePage,Contents,Messaging,Navigation,Reports,Scheduling,Indexing,Settings,Localization,XmlRpc,Orchard.Users,Orchard.Roles,TinyMce,Orchard.Themes,Orchard.MultiTenancy,Orchard.Blogs,Orchard.Comments,Orchard.Modules,Orchard.Widgets,Orchard.Media,Orchard.Tags,Orchard.Experimental
|
||||||
add profiling data
|
|
||||||
feature disable Orchard.Experimental
|
|
||||||
|
@@ -11,6 +11,7 @@ using Orchard.Environment.Extensions.Loaders;
|
|||||||
using Orchard.Environment.Extensions.Models;
|
using Orchard.Environment.Extensions.Models;
|
||||||
using Orchard.FileSystems.Dependencies;
|
using Orchard.FileSystems.Dependencies;
|
||||||
using Orchard.Tests.Extensions.ExtensionTypes;
|
using Orchard.Tests.Extensions.ExtensionTypes;
|
||||||
|
using Orchard.Tests.Stubs;
|
||||||
|
|
||||||
namespace Orchard.Tests.Environment.Extensions {
|
namespace Orchard.Tests.Environment.Extensions {
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
@@ -265,7 +266,7 @@ Features:
|
|||||||
Description: Contains the Phi type.
|
Description: Contains the Phi type.
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var testFeature = extensionManager.AvailableExtensions()
|
var testFeature = extensionManager.AvailableExtensions()
|
||||||
.SelectMany(x => x.Features);
|
.SelectMany(x => x.Features);
|
||||||
|
|
||||||
@@ -291,7 +292,7 @@ Features:
|
|||||||
Description: Contains the Phi type.
|
Description: Contains the Phi type.
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var testFeature = extensionManager.AvailableExtensions()
|
var testFeature = extensionManager.AvailableExtensions()
|
||||||
.SelectMany(x => x.Features);
|
.SelectMany(x => x.Features);
|
||||||
|
|
||||||
@@ -326,7 +327,7 @@ Features:
|
|||||||
Description: Contains the Phi type.
|
Description: Contains the Phi type.
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var testFeature = extensionManager.AvailableExtensions()
|
var testFeature = extensionManager.AvailableExtensions()
|
||||||
.SelectMany(x => x.Features)
|
.SelectMany(x => x.Features)
|
||||||
.Single(x => x.Name == "TestFeature");
|
.Single(x => x.Name == "TestFeature");
|
||||||
@@ -356,7 +357,7 @@ Features:
|
|||||||
Description: Contains the Phi type.
|
Description: Contains the Phi type.
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var testFeature = extensionManager.AvailableExtensions()
|
var testFeature = extensionManager.AvailableExtensions()
|
||||||
.SelectMany(x => x.Features)
|
.SelectMany(x => x.Features)
|
||||||
.Single(x => x.Name == "TestFeature");
|
.Single(x => x.Name == "TestFeature");
|
||||||
@@ -384,7 +385,7 @@ Features:
|
|||||||
Description: Contains the Phi type.
|
Description: Contains the Phi type.
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var testModule = extensionManager.AvailableExtensions()
|
var testModule = extensionManager.AvailableExtensions()
|
||||||
.SelectMany(x => x.Features)
|
.SelectMany(x => x.Features)
|
||||||
.Single(x => x.Name == "TestModule");
|
.Single(x => x.Name == "TestModule");
|
||||||
@@ -408,7 +409,7 @@ Version: 1.0.3
|
|||||||
OrchardVersion: 1
|
OrchardVersion: 1
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var minimalisticModule = extensionManager.AvailableExtensions().Single(x => x.Name == "Minimalistic");
|
var minimalisticModule = extensionManager.AvailableExtensions().Single(x => x.Name == "Minimalistic");
|
||||||
|
|
||||||
Assert.That(minimalisticModule.Features.Count(), Is.EqualTo(1));
|
Assert.That(minimalisticModule.Features.Count(), Is.EqualTo(1));
|
||||||
@@ -427,7 +428,7 @@ Version: 1.0.3
|
|||||||
OrchardVersion: 1
|
OrchardVersion: 1
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var minimalisticModule = extensionManager.AvailableExtensions().Single(x => x.Name == "Minimalistic");
|
var minimalisticModule = extensionManager.AvailableExtensions().Single(x => x.Name == "Minimalistic");
|
||||||
|
|
||||||
Assert.That(minimalisticModule.Features.Count(), Is.EqualTo(1));
|
Assert.That(minimalisticModule.Features.Count(), Is.EqualTo(1));
|
||||||
|
@@ -11,6 +11,7 @@ using Orchard.Environment.Extensions.Loaders;
|
|||||||
using Orchard.Environment.Extensions.Models;
|
using Orchard.Environment.Extensions.Models;
|
||||||
using Orchard.FileSystems.Dependencies;
|
using Orchard.FileSystems.Dependencies;
|
||||||
using Orchard.Tests.Extensions.ExtensionTypes;
|
using Orchard.Tests.Extensions.ExtensionTypes;
|
||||||
|
using Orchard.Tests.Stubs;
|
||||||
|
|
||||||
namespace Orchard.Tests.Environment.Extensions {
|
namespace Orchard.Tests.Environment.Extensions {
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
@@ -268,7 +269,7 @@ Features:
|
|||||||
Description: Contains the Phi type.
|
Description: Contains the Phi type.
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var testFeature = extensionManager.AvailableExtensions()
|
var testFeature = extensionManager.AvailableExtensions()
|
||||||
.SelectMany(x => x.Features);
|
.SelectMany(x => x.Features);
|
||||||
|
|
||||||
@@ -294,7 +295,7 @@ Features:
|
|||||||
Description: Contains the Phi type.
|
Description: Contains the Phi type.
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var testFeature = extensionManager.AvailableExtensions()
|
var testFeature = extensionManager.AvailableExtensions()
|
||||||
.SelectMany(x => x.Features);
|
.SelectMany(x => x.Features);
|
||||||
|
|
||||||
@@ -329,7 +330,7 @@ Features:
|
|||||||
Description: Contains the Phi type.
|
Description: Contains the Phi type.
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var testFeature = extensionManager.AvailableExtensions()
|
var testFeature = extensionManager.AvailableExtensions()
|
||||||
.SelectMany(x => x.Features)
|
.SelectMany(x => x.Features)
|
||||||
.Single(x => x.Name == "TestFeature");
|
.Single(x => x.Name == "TestFeature");
|
||||||
@@ -359,7 +360,7 @@ Features:
|
|||||||
Description: Contains the Phi type.
|
Description: Contains the Phi type.
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var testFeature = extensionManager.AvailableExtensions()
|
var testFeature = extensionManager.AvailableExtensions()
|
||||||
.SelectMany(x => x.Features)
|
.SelectMany(x => x.Features)
|
||||||
.Single(x => x.Name == "TestFeature");
|
.Single(x => x.Name == "TestFeature");
|
||||||
@@ -387,7 +388,7 @@ Features:
|
|||||||
Description: Contains the Phi type.
|
Description: Contains the Phi type.
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var testModule = extensionManager.AvailableExtensions()
|
var testModule = extensionManager.AvailableExtensions()
|
||||||
.SelectMany(x => x.Features)
|
.SelectMany(x => x.Features)
|
||||||
.Single(x => x.Name == "TestModule");
|
.Single(x => x.Name == "TestModule");
|
||||||
@@ -411,7 +412,7 @@ Version: 1.0.3
|
|||||||
OrchardVersion: 1
|
OrchardVersion: 1
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var minimalisticModule = extensionManager.AvailableExtensions().Single(x => x.Name == "Minimalistic");
|
var minimalisticModule = extensionManager.AvailableExtensions().Single(x => x.Name == "Minimalistic");
|
||||||
|
|
||||||
Assert.That(minimalisticModule.Features.Count(), Is.EqualTo(1));
|
Assert.That(minimalisticModule.Features.Count(), Is.EqualTo(1));
|
||||||
@@ -447,7 +448,7 @@ Features:
|
|||||||
Dependencies: Beta
|
Dependencies: Beta
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { extensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var features = extensionManager.AvailableFeatures();
|
var features = extensionManager.AvailableFeatures();
|
||||||
Assert.That(features.Aggregate("<", (a,b)=>a+b.Name+"<"), Is.EqualTo("<Beta<Gamma<Alpha<"));
|
Assert.That(features.Aggregate("<", (a,b)=>a+b.Name+"<"), Is.EqualTo("<Beta<Gamma<Alpha<"));
|
||||||
}
|
}
|
||||||
@@ -487,7 +488,7 @@ Version: 1.0.3
|
|||||||
OrchardVersion: 1
|
OrchardVersion: 1
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { moduleExtensionFolder, themeExtensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { moduleExtensionFolder, themeExtensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var features = extensionManager.AvailableFeatures();
|
var features = extensionManager.AvailableFeatures();
|
||||||
Assert.That(features.Count(), Is.EqualTo(4));
|
Assert.That(features.Count(), Is.EqualTo(4));
|
||||||
}
|
}
|
||||||
@@ -530,7 +531,7 @@ Features:
|
|||||||
Dependencies: Alpha
|
Dependencies: Alpha
|
||||||
");
|
");
|
||||||
|
|
||||||
IExtensionManager extensionManager = new ExtensionManager(new[] { moduleExtensionFolder, themeExtensionFolder }, new[] { extensionLoader });
|
IExtensionManager extensionManager = new ExtensionManager(new[] { moduleExtensionFolder, themeExtensionFolder }, new[] { extensionLoader }, new StubCacheManager());
|
||||||
var features = extensionManager.AvailableFeatures();
|
var features = extensionManager.AvailableFeatures();
|
||||||
Assert.That(features.Aggregate("<", (a, b) => a + b.Name + "<"), Is.EqualTo("<Beta<Gamma<Alpha<Classic<"));
|
Assert.That(features.Aggregate("<", (a, b) => a + b.Name + "<"), Is.EqualTo("<Beta<Gamma<Alpha<Classic<"));
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
@Display(Model.Metadata.ChildContent)
|
@Display(Model.Metadata.ChildContent)
|
||||||
@{
|
@{
|
||||||
var workContext = ViewContext.GetWorkContext();
|
var workContext = ViewContext.GetWorkContext();
|
||||||
var shapeTable = workContext.Resolve<IShapeTableManager>().GetShapeTable(workContext.CurrentTheme.ThemeName);
|
var shapeTable = workContext.Resolve<IShapeTableManager>().GetShapeTable(workContext.CurrentTheme.Name);
|
||||||
<!--
|
<!--
|
||||||
<ul>
|
<ul>
|
||||||
@foreach(var binding in shapeTable.Bindings) {
|
@foreach(var binding in shapeTable.Bindings) {
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
@using Orchard.DisplayManagement.Descriptors;
|
@using Orchard.DisplayManagement.Descriptors;
|
||||||
@{
|
@{
|
||||||
var workContext = ViewContext.GetWorkContext();
|
var workContext = ViewContext.GetWorkContext();
|
||||||
var shapeTable = workContext.Resolve<IShapeTableManager>().GetShapeTable(workContext.CurrentTheme.ThemeName);
|
var shapeTable = workContext.Resolve<IShapeTableManager>().GetShapeTable(workContext.CurrentTheme.Name);
|
||||||
var descriptor = shapeTable.Descriptors[Model.Metadata.Type];
|
var descriptor = shapeTable.Descriptors[Model.Metadata.Type];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
|
using Orchard.Caching;
|
||||||
using Orchard.Environment.Extensions.Folders;
|
using Orchard.Environment.Extensions.Folders;
|
||||||
using Orchard.Environment.Extensions.Loaders;
|
using Orchard.Environment.Extensions.Loaders;
|
||||||
using Orchard.Environment.Extensions.Models;
|
using Orchard.Environment.Extensions.Models;
|
||||||
@@ -13,15 +14,17 @@ using Orchard.Utility.Extensions;
|
|||||||
namespace Orchard.Environment.Extensions {
|
namespace Orchard.Environment.Extensions {
|
||||||
public class ExtensionManager : IExtensionManager {
|
public class ExtensionManager : IExtensionManager {
|
||||||
private readonly IEnumerable<IExtensionFolders> _folders;
|
private readonly IEnumerable<IExtensionFolders> _folders;
|
||||||
|
private readonly ICacheManager _cacheManager;
|
||||||
private readonly IEnumerable<IExtensionLoader> _loaders;
|
private readonly IEnumerable<IExtensionLoader> _loaders;
|
||||||
private IEnumerable<FeatureDescriptor> _featureDescriptors;
|
private IEnumerable<FeatureDescriptor> _featureDescriptors;
|
||||||
|
|
||||||
public Localizer T { get; set; }
|
public Localizer T { get; set; }
|
||||||
public ILogger Logger { get; set; }
|
public ILogger Logger { get; set; }
|
||||||
|
|
||||||
public ExtensionManager(IEnumerable<IExtensionFolders> folders, IEnumerable<IExtensionLoader> loaders) {
|
public ExtensionManager(IEnumerable<IExtensionFolders> folders, IEnumerable<IExtensionLoader> loaders, ICacheManager cacheManager) {
|
||||||
_folders = folders;
|
_folders = folders;
|
||||||
_loaders = loaders.OrderBy(x => x.Order);
|
_cacheManager = cacheManager;
|
||||||
|
_loaders = loaders.OrderBy(x => x.Order).ToArray();
|
||||||
T = NullLocalizer.Instance;
|
T = NullLocalizer.Instance;
|
||||||
Logger = NullLogger.Instance;
|
Logger = NullLogger.Instance;
|
||||||
}
|
}
|
||||||
@@ -67,35 +70,20 @@ namespace Orchard.Environment.Extensions {
|
|||||||
item.Dependencies.Any(x => StringComparer.OrdinalIgnoreCase.Equals(x, subject.Name));
|
item.Dependencies.Any(x => StringComparer.OrdinalIgnoreCase.Equals(x, subject.Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<ExtensionEntry> LoadedExtensions() {
|
|
||||||
foreach (var descriptor in AvailableExtensions()) {
|
|
||||||
ExtensionEntry entry = null;
|
|
||||||
try {
|
|
||||||
entry = BuildEntry(descriptor);
|
|
||||||
}
|
|
||||||
catch (HttpCompileException ex) {
|
|
||||||
Logger.Warning(ex, "Unable to load extension {0}", descriptor.Name);
|
|
||||||
}
|
|
||||||
if (entry != null)
|
|
||||||
yield return entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<Feature> LoadFeatures(IEnumerable<FeatureDescriptor> featureDescriptors) {
|
public IEnumerable<Feature> LoadFeatures(IEnumerable<FeatureDescriptor> featureDescriptors) {
|
||||||
return featureDescriptors
|
return featureDescriptors
|
||||||
.Select(LoadFeature)
|
.Select(descriptor => _cacheManager.Get(descriptor.Name, ctx => LoadFeature(descriptor)))
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Feature LoadFeature(FeatureDescriptor featureDescriptor) {
|
private Feature LoadFeature(FeatureDescriptor featureDescriptor) {
|
||||||
|
|
||||||
|
var extensionDescriptor = featureDescriptor.Extension;
|
||||||
var featureName = featureDescriptor.Name;
|
var featureName = featureDescriptor.Name;
|
||||||
|
var extensionName = extensionDescriptor.Name;
|
||||||
|
|
||||||
string extensionName = GetExtensionForFeature(featureName);
|
var extensionEntry = _cacheManager.Get(extensionName, ctx => BuildEntry(extensionDescriptor));
|
||||||
if (extensionName == null)
|
if (extensionEntry == null) {
|
||||||
throw new ArgumentException(T("Feature {0} was not found in any of the installed extensions", featureName).ToString());
|
|
||||||
|
|
||||||
var extension = LoadedExtensions().Where(x => x.Descriptor.Name == extensionName).FirstOrDefault();
|
|
||||||
if (extension == null) {
|
|
||||||
// If the feature could not be compiled for some reason,
|
// If the feature could not be compiled for some reason,
|
||||||
// return a "null" feature, i.e. a feature with no exported types.
|
// return a "null" feature, i.e. a feature with no exported types.
|
||||||
return new Feature {
|
return new Feature {
|
||||||
@@ -104,7 +92,7 @@ namespace Orchard.Environment.Extensions {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
var extensionTypes = extension.ExportedTypes.Where(t => t.IsClass && !t.IsAbstract);
|
var extensionTypes = extensionEntry.ExportedTypes.Where(t => t.IsClass && !t.IsAbstract);
|
||||||
var featureTypes = new List<Type>();
|
var featureTypes = new List<Type>();
|
||||||
|
|
||||||
foreach (var type in extensionTypes) {
|
foreach (var type in extensionTypes) {
|
||||||
@@ -126,21 +114,7 @@ namespace Orchard.Environment.Extensions {
|
|||||||
}
|
}
|
||||||
return extensionName;
|
return extensionName;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetExtensionForFeature(string featureName) {
|
|
||||||
foreach (var extensionDescriptor in AvailableExtensions()) {
|
|
||||||
if (String.Equals(extensionDescriptor.Name, featureName, StringComparison.OrdinalIgnoreCase)) {
|
|
||||||
return extensionDescriptor.Name;
|
|
||||||
}
|
|
||||||
foreach (var feature in extensionDescriptor.Features) {
|
|
||||||
if (String.Equals(feature.Name, featureName, StringComparison.OrdinalIgnoreCase)) {
|
|
||||||
return extensionDescriptor.Name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ExtensionEntry BuildEntry(ExtensionDescriptor descriptor) {
|
private ExtensionEntry BuildEntry(ExtensionDescriptor descriptor) {
|
||||||
foreach (var loader in _loaders) {
|
foreach (var loader in _loaders) {
|
||||||
ExtensionEntry entry = loader.Load(descriptor);
|
ExtensionEntry entry = loader.Load(descriptor);
|
||||||
|
@@ -14,14 +14,6 @@ namespace Orchard.Environment.Extensions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class ExtensionManagerExtensions {
|
public static class ExtensionManagerExtensions {
|
||||||
public static IEnumerable<ExtensionDescriptor> EnabledExtensions(this IExtensionManager extensionManager, ShellDescriptor descriptor) {
|
|
||||||
var enabledFeatures = EnabledFeatures(extensionManager, descriptor);
|
|
||||||
return extensionManager.AvailableExtensions()
|
|
||||||
.Where(extensionDescriptor =>
|
|
||||||
extensionDescriptor.Features.Any(featureDescriptor =>
|
|
||||||
enabledFeatures.Any(availableFeature => featureDescriptor.Name == availableFeature.Name)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IEnumerable<FeatureDescriptor> EnabledFeatures(this IExtensionManager extensionManager, ShellDescriptor descriptor) {
|
public static IEnumerable<FeatureDescriptor> EnabledFeatures(this IExtensionManager extensionManager, ShellDescriptor descriptor) {
|
||||||
return extensionManager.AvailableExtensions()
|
return extensionManager.AvailableExtensions()
|
||||||
.SelectMany(extensionDescriptor => extensionDescriptor.Features)
|
.SelectMany(extensionDescriptor => extensionDescriptor.Features)
|
||||||
|
Reference in New Issue
Block a user