diff --git a/src/Orchard.Tests/Environment/DefaultCompositionStrategyTests.cs b/src/Orchard.Tests/Environment/DefaultCompositionStrategyTests.cs index 60afb40ff..077e527a5 100644 --- a/src/Orchard.Tests/Environment/DefaultCompositionStrategyTests.cs +++ b/src/Orchard.Tests/Environment/DefaultCompositionStrategyTests.cs @@ -1,29 +1,133 @@ -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using Autofac; +using Moq; using NUnit.Framework; using Orchard.Environment; +using Orchard.Environment.Topology; +using Orchard.Environment.Topology.Models; using Orchard.Extensions; -using Orchard.Tests.ContentManagement.Records; -using Orchard.Tests.ContentManagement.Models; +using Orchard.Extensions.Models; +using Orchard.Tests.Utility; namespace Orchard.Tests.Environment { [TestFixture] public class DefaultCompositionStrategyTests { - [Test] - public void ExpectedRecordsShouldComeBack() { - var extensionManager = new Moq.Mock(); - extensionManager.Setup(x => x.ActiveExtensions()).Returns(new[] { - new ExtensionEntry { - Descriptor = new ExtensionDescriptor { Name = "Test" }, - ExportedTypes = new[] { typeof(GammaRecord), typeof(DeltaRecord), typeof(Delta) } - } - }); - var strategy = new DefaultCompositionStrategy(extensionManager.Object); - var recordTypes = strategy.GetRecordDescriptors().Select(d => d.Type); - Assert.That(recordTypes.Count(), Is.Not.EqualTo(0)); - Assert.That(recordTypes, Has.Some.EqualTo(typeof(DeltaRecord))); - Assert.That(recordTypes, Has.Some.EqualTo(typeof(GammaRecord))); - Assert.That(recordTypes, Has.None.EqualTo(typeof(Delta))); + private IContainer _container; + + private IEnumerable _extensionDescriptors; + private IDictionary> _featureTypes; + + + [SetUp] + public void Init() { + var builder = new ContainerBuilder(); + builder.RegisterType().As(); + builder.RegisterAutoMocking(MockBehavior.Strict); + _container = builder.Build(); + + _extensionDescriptors = Enumerable.Empty(); + _featureTypes = new Dictionary>(); + + _container.Mock() + .Setup(x => x.AvailableExtensions()) + .Returns(() => _extensionDescriptors); + + _container.Mock() + .Setup(x => x.LoadFeatures(It.IsAny>())) + .Returns((IEnumerable x) => StubLoadFeatures(x)); + } + + private IEnumerable StubLoadFeatures(IEnumerable featureDescriptors) { + return featureDescriptors.Select(featureDescriptor => new Feature { + FeatureDescriptor = featureDescriptor, + ExportedTypes = _featureTypes[featureDescriptor.Name] + }); + } + + [Test] + public void TopologyIsNotNull() { + var descriptor = Build.TopologyDescriptor(); + + var compositionStrategy = _container.Resolve(); + var topology = compositionStrategy.Compose(descriptor); + + Assert.That(topology, Is.Not.Null); + } + + [Test] + public void DependenciesFromFeatureArePutIntoTopology() { + var descriptor = Build.TopologyDescriptor().WithFeatures("Foo", "Bar"); + + _extensionDescriptors = new[] { + Build.ExtensionDescriptor("Foo").WithFeatures("Foo"), + Build.ExtensionDescriptor("Bar").WithFeatures("Bar"), + }; + + _featureTypes["Foo"] = new[] { typeof(FooService1) }; + _featureTypes["Bar"] = new[] { typeof(BarService1) }; + + var compositionStrategy = _container.Resolve(); + var topology = compositionStrategy.Compose(descriptor); + + Assert.That(topology, Is.Not.Null); + Assert.That(topology.Dependencies.Count(), Is.EqualTo(2)); + + var foo = topology.Dependencies.SingleOrDefault(t => t.Type == typeof (FooService1)); + Assert.That(foo, Is.Not.Null); + Assert.That(foo.Feature.FeatureDescriptor.Name, Is.EqualTo("Foo")); + + var bar = topology.Dependencies.SingleOrDefault(t => t.Type == typeof(BarService1)); + Assert.That(bar, Is.Not.Null); + Assert.That(bar.Feature.FeatureDescriptor.Name, Is.EqualTo("Bar")); + } + + public interface IFooService : IDependency { + } + + public class FooService1 : IFooService { + } + + public interface IBarService : IDependency { + } + + public class BarService1 : IBarService { + } + } + + + static class Build { + + public static ShellTopologyDescriptor TopologyDescriptor() { + var descriptor = new ShellTopologyDescriptor { + EnabledFeatures = Enumerable.Empty(), + }; + return descriptor; + } + + public static ShellTopologyDescriptor WithFeatures(this ShellTopologyDescriptor descriptor, params string[] names) { + descriptor.EnabledFeatures = descriptor.EnabledFeatures.Concat( + names.Select(name => new TopologyFeature { Name = name })); + + return descriptor; + } + + public static ExtensionDescriptor ExtensionDescriptor(string name) { + var descriptor = new ExtensionDescriptor { + Name = name, + DisplayName = name, + Features = Enumerable.Empty(), + }; + return descriptor; + } + + public static ExtensionDescriptor WithFeatures(this ExtensionDescriptor descriptor, params string[] names) { + descriptor.Features = descriptor.Features.Concat( + names.Select(name => new FeatureDescriptor() { Name = name })); + + return descriptor; } } } diff --git a/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs b/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs index 3f1d04a98..6e172f92c 100644 --- a/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs +++ b/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs @@ -14,6 +14,7 @@ using Orchard.Environment.Configuration; using Orchard.Environment.ShellBuilders; using Orchard.Environment.Topology; using Orchard.Environment.Topology.Models; +using Orchard.Extensions.Models; using Orchard.Mvc; using Orchard.Mvc.ModelBinders; using Orchard.Mvc.Routes; @@ -78,6 +79,10 @@ namespace Orchard.Tests.Environment { return Enumerable.Empty(); } + public IEnumerable LoadFeatures(IEnumerable features) { + throw new NotImplementedException(); + } + public IEnumerable ActiveExtensions() { return Enumerable.Empty(); } diff --git a/src/Orchard.Tests/Environment/ShellBuilders/DefaultShellContextFactoryTests.cs b/src/Orchard.Tests/Environment/ShellBuilders/DefaultShellContextFactoryTests.cs index bc3521a56..9e97778cd 100644 --- a/src/Orchard.Tests/Environment/ShellBuilders/DefaultShellContextFactoryTests.cs +++ b/src/Orchard.Tests/Environment/ShellBuilders/DefaultShellContextFactoryTests.cs @@ -1,17 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using Autofac; -using Autofac.Builder; -using Autofac.Core; +using Autofac; using Autofac.Core.Registration; -using Moq; using NUnit.Framework; using Orchard.Environment; using Orchard.Environment.Configuration; using Orchard.Environment.ShellBuilders; using Orchard.Environment.Topology; using Orchard.Environment.Topology.Models; +using Orchard.Tests.Utility; namespace Orchard.Tests.Environment.ShellBuilders { [TestFixture] @@ -22,7 +17,7 @@ namespace Orchard.Tests.Environment.ShellBuilders { public void Init() { var builder = new ContainerBuilder(); builder.RegisterType().As(); - builder.RegisterSource(new MockServiceSource()); + builder.RegisterAutoMocking(); _container = builder.Build(); } @@ -60,39 +55,4 @@ namespace Orchard.Tests.Environment.ShellBuilders { Assert.That(context.Shell, Is.SameAs(shellLifetimeScope.Resolve())); } } - - class MockServiceSource : IRegistrationSource { - public IEnumerable RegistrationsFor( - Service service, - Func> registrationAccessor) { - - var swt = service as IServiceWithType; - if (swt == null) - yield break; - var st = swt.ServiceType; - - if (st.IsGenericType && st.GetGenericTypeDefinition() == typeof(Mock<>)) { - yield return RegistrationBuilder.ForType(st).SingleInstance().CreateRegistration(); - } - else if (st.IsInterface) { - yield return RegistrationBuilder.ForDelegate( - (ctx, p) => { - Trace.WriteLine(string.Format("Mocking {0}", st)); - var mt = typeof(Mock<>).MakeGenericType(st); - var m = (Mock)ctx.Resolve(mt); - return m.Object; - }) - .As(service) - .SingleInstance() - .CreateRegistration(); - - } - } - } - - public static class MockExtensions { - public static Mock Mock(this IContainer container) where T : class { - return container.Resolve>(); - } - } } diff --git a/src/Orchard.Tests/Extensions/ExtensionManagerTests.cs b/src/Orchard.Tests/Extensions/ExtensionManagerTests.cs index 90b562569..c323d38a1 100644 --- a/src/Orchard.Tests/Extensions/ExtensionManagerTests.cs +++ b/src/Orchard.Tests/Extensions/ExtensionManagerTests.cs @@ -5,6 +5,7 @@ using Autofac; using NUnit.Framework; using Orchard.Extensions; using Orchard.Extensions.Loaders; +using Orchard.Extensions.Models; using Orchard.Tests.Extensions.ExtensionTypes; using Yaml.Grammar; diff --git a/src/Orchard.Tests/Mvc/Routes/StandardExtensionRouteProviderTests.cs b/src/Orchard.Tests/Mvc/Routes/StandardExtensionRouteProviderTests.cs index 06c5a9222..8d7d28883 100644 --- a/src/Orchard.Tests/Mvc/Routes/StandardExtensionRouteProviderTests.cs +++ b/src/Orchard.Tests/Mvc/Routes/StandardExtensionRouteProviderTests.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Web; using System.Web.Routing; using NUnit.Framework; +using Orchard.Extensions.Models; using Orchard.Mvc.Routes; using Orchard.Extensions; @@ -39,6 +40,10 @@ namespace Orchard.Tests.Mvc.Routes { throw new NotImplementedException(); } + public IEnumerable LoadFeatures(IEnumerable features) { + throw new NotImplementedException(); + } + public IEnumerable ActiveExtensions() { yield return new ExtensionEntry { Descriptor = new ExtensionDescriptor { diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj index 76e8fb4a5..b5540f899 100644 --- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj @@ -165,6 +165,7 @@ + diff --git a/src/Orchard.Tests/Utility/ContainerExtensions.cs b/src/Orchard.Tests/Utility/ContainerExtensions.cs new file mode 100644 index 000000000..9b1694904 --- /dev/null +++ b/src/Orchard.Tests/Utility/ContainerExtensions.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Autofac; +using Autofac.Builder; +using Autofac.Core; +using Moq; + +namespace Orchard.Tests.Utility { + public static class ContainerExtensions { + public static Mock Mock(this IContainer container) where T : class { + return container.Resolve>(); + } + + public static void RegisterAutoMocking(this ContainerBuilder builder) { + builder.RegisterSource(new AutoMockSource(MockBehavior.Default)); + } + + public static void RegisterAutoMocking(this ContainerBuilder builder, MockBehavior behavior) { + builder.RegisterSource(new AutoMockSource(behavior)); + } + class AutoMockSource : IRegistrationSource { + private readonly MockBehavior _behavior; + + public AutoMockSource(MockBehavior behavior) { + _behavior = behavior; + } + + public IEnumerable RegistrationsFor( + Service service, + Func> registrationAccessor) { + + var swt = service as IServiceWithType; + if (swt == null) + yield break; + var st = swt.ServiceType; + + if (st.IsGenericType && st.GetGenericTypeDefinition() == typeof(Mock<>)) { + yield return RegistrationBuilder.ForType(st) + .SingleInstance() + .WithParameter("behavior", _behavior) + .CreateRegistration(); + } + else if (st.IsInterface) { + yield return RegistrationBuilder.ForDelegate( + (ctx, p) => { + Trace.WriteLine(string.Format("Mocking {0}", st)); + var mt = typeof(Mock<>).MakeGenericType(st); + var m = (Mock)ctx.Resolve(mt); + return m.Object; + }) + .As(service) + .SingleInstance() + .CreateRegistration(); + + } + } + } + + } +} \ No newline at end of file diff --git a/src/Orchard/Environment/DefaultCompositionStrategy.cs b/src/Orchard/Environment/DefaultCompositionStrategy.cs index 47e50edbe..4c82f3832 100644 --- a/src/Orchard/Environment/DefaultCompositionStrategy.cs +++ b/src/Orchard/Environment/DefaultCompositionStrategy.cs @@ -2,10 +2,14 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Web.Mvc; using Autofac.Core; using Orchard.ContentManagement; using Orchard.ContentManagement.Records; +using Orchard.Environment.Topology; +using Orchard.Environment.Topology.Models; using Orchard.Extensions; +using Orchard.Extensions.Models; using Orchard.Utility.Extensions; using Orchard.Extensions.Records; @@ -23,13 +27,83 @@ namespace Orchard.Environment { public string Prefix { get; set; } } - public class DefaultCompositionStrategy : ICompositionStrategy_Obsolete { + public class DefaultCompositionStrategy : ICompositionStrategy, ICompositionStrategy_Obsolete { private readonly IExtensionManager _extensionManager; public DefaultCompositionStrategy(IExtensionManager extensionManager) { _extensionManager = extensionManager; } + public ShellTopology Compose(ShellTopologyDescriptor topologyDescriptor) { + + var featureDescriptors = _extensionManager.AvailableExtensions() + .SelectMany(extensionDescriptor => extensionDescriptor.Features) + .Where(featureDescriptor => IsFeatureEnabledInTopology(featureDescriptor, topologyDescriptor)); + + var features = _extensionManager.LoadFeatures(featureDescriptors); + + return new ShellTopology { + Modules = BuildTopology(features, IsModule, BuildModule), + Dependencies = BuildTopology(features, IsDependency, BuildDependency), + Controllers = BuildTopology(features, IsController, BuildController), + Records = BuildTopology(features, IsRecord, BuildRecord), + }; + } + + + private static bool IsFeatureEnabledInTopology(FeatureDescriptor featureDescriptor, ShellTopologyDescriptor topologyDescriptor) { + return topologyDescriptor.EnabledFeatures.Any(topologyFeature => topologyFeature.Name == featureDescriptor.Name); + } + + private static IEnumerable BuildTopology( + IEnumerable features, + Func predicate, + Func selector) { + return features.SelectMany( + feature => feature.ExportedTypes + .Where(predicate) + .Select(type => selector(type, feature))) + .ToArray(); + } + + private static bool IsModule(Type type) { + return typeof(IModule).IsAssignableFrom(type); + } + + private static ModuleTopology BuildModule(Type type, Feature feature) { + return new ModuleTopology { Type = type, Feature = feature }; + } + + private static bool IsDependency(Type type) { + return typeof(IDependency).IsAssignableFrom(type); + } + + private static DependencyTopology BuildDependency(Type type, Feature feature) { + return new DependencyTopology {Type = type, Feature = feature}; + } + + private static bool IsController(Type type) { + return typeof(IController).IsAssignableFrom(type); + } + + private static ControllerTopology BuildController(Type type, Feature feature) { + return new ControllerTopology { Type = type, Feature = feature }; + } + + private static bool IsRecord(Type type) { + return ((type.Namespace ?? "").EndsWith(".Models") || (type.Namespace ?? "").EndsWith(".Records")) && + type.GetProperty("Id") != null && + (type.GetProperty("Id").GetAccessors() ?? Enumerable.Empty()).All(x => x.IsVirtual) && + !type.IsSealed && + !type.IsAbstract && + (!typeof(IContent).IsAssignableFrom(type) || typeof(ContentPartRecord).IsAssignableFrom(type));; + } + + private static RecordTopology BuildRecord(Type type, Feature feature) { + return new RecordTopology { Type = type, Feature = feature }; + } + + public IEnumerable GetModuleTypes() { return _extensionManager.GetExtensionsTopology().Types.Where(t => typeof(IModule).IsAssignableFrom(t)); } @@ -70,5 +144,6 @@ namespace Orchard.Environment { !type.IsAbstract && (!typeof(IContent).IsAssignableFrom(type) || typeof(ContentPartRecord).IsAssignableFrom(type)); } + } } \ No newline at end of file diff --git a/src/Orchard/Environment/DefaultOrchardShell.cs b/src/Orchard/Environment/DefaultOrchardShell.cs index e3b071436..e2f449037 100644 --- a/src/Orchard/Environment/DefaultOrchardShell.cs +++ b/src/Orchard/Environment/DefaultOrchardShell.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Web.Mvc; +using Orchard.Extensions.Models; using Orchard.Logging; using Orchard.Mvc.ModelBinders; using Orchard.Mvc.Routes; -using Orchard.Extensions; using Orchard.Utility; namespace Orchard.Environment { diff --git a/src/Orchard/Environment/Topology/Models/ShellTopology.cs b/src/Orchard/Environment/Topology/Models/ShellTopology.cs index 562876c29..3b66b00a1 100644 --- a/src/Orchard/Environment/Topology/Models/ShellTopology.cs +++ b/src/Orchard/Environment/Topology/Models/ShellTopology.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using Orchard.Environment.Configuration; using Orchard.Extensions; +using Orchard.Extensions.Models; namespace Orchard.Environment.Topology.Models { public class ShellTopology { @@ -14,6 +15,7 @@ namespace Orchard.Environment.Topology.Models { public class ShellTopologyItem { public Type Type { get; set; } + public Feature Feature { get; set; } public ExtensionDescriptor ExtensionDescriptor { get; set; } public FeatureDescriptor FeatureDescriptor { get; set; } public ExtensionEntry ExtensionEntry { get; set; } diff --git a/src/Orchard/Extensions/ExtensionEntry.cs b/src/Orchard/Extensions/ExtensionEntry.cs index a2e44f511..78c396725 100644 --- a/src/Orchard/Extensions/ExtensionEntry.cs +++ b/src/Orchard/Extensions/ExtensionEntry.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using Orchard.Extensions.Models; namespace Orchard.Extensions { public class ExtensionEntry { diff --git a/src/Orchard/Extensions/ExtensionManager.cs b/src/Orchard/Extensions/ExtensionManager.cs index 0cc6cb3c6..06189723e 100644 --- a/src/Orchard/Extensions/ExtensionManager.cs +++ b/src/Orchard/Extensions/ExtensionManager.cs @@ -6,6 +6,7 @@ using ICSharpCode.SharpZipLib.Zip; using Orchard.Environment; using Orchard.Extensions.Helpers; using Orchard.Extensions.Loaders; +using Orchard.Extensions.Models; using Orchard.Localization; using Orchard.Logging; using Yaml.Grammar; @@ -45,6 +46,10 @@ namespace Orchard.Extensions { return availableExtensions; } + public IEnumerable LoadFeatures(IEnumerable features) { + throw new NotImplementedException(); + } + // This method loads types from extensions into the ExtensionEntry array. public IEnumerable ActiveExtensions() { if (_activeExtensions == null) { @@ -52,6 +57,7 @@ namespace Orchard.Extensions { } return _activeExtensions; } + private static ExtensionDescriptor GetDescriptorForExtension(string name, IExtensionFolders folder) { string extensionType = folder is ThemeFolders ? "Theme" : "Module"; diff --git a/src/Orchard/Extensions/IExtensionManager.cs b/src/Orchard/Extensions/IExtensionManager.cs index bb138709d..707d4457d 100644 --- a/src/Orchard/Extensions/IExtensionManager.cs +++ b/src/Orchard/Extensions/IExtensionManager.cs @@ -1,13 +1,17 @@ using System; using System.Collections.Generic; using System.Web; +using Orchard.Extensions.Models; namespace Orchard.Extensions { public interface IExtensionManager { IEnumerable AvailableExtensions(); + IEnumerable LoadFeature(string featureName); + IEnumerable LoadFeatures(IEnumerable features); + IEnumerable ActiveExtensions(); ShellTopology_Obsolete GetExtensionsTopology(); - IEnumerable LoadFeature(string featureName); + void InstallExtension(string extensionType, HttpPostedFileBase extensionBundle); void UninstallExtension(string extensionType, string extensionName); } diff --git a/src/Orchard/Extensions/Loaders/AreaExtensionLoader.cs b/src/Orchard/Extensions/Loaders/AreaExtensionLoader.cs index 61555b831..1a4226687 100644 --- a/src/Orchard/Extensions/Loaders/AreaExtensionLoader.cs +++ b/src/Orchard/Extensions/Loaders/AreaExtensionLoader.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Reflection; +using Orchard.Extensions.Models; namespace Orchard.Extensions.Loaders { public class AreaExtensionLoader : IExtensionLoader { diff --git a/src/Orchard/Extensions/Loaders/CoreExtensionLoader.cs b/src/Orchard/Extensions/Loaders/CoreExtensionLoader.cs index 7bd739a23..baa87cd06 100644 --- a/src/Orchard/Extensions/Loaders/CoreExtensionLoader.cs +++ b/src/Orchard/Extensions/Loaders/CoreExtensionLoader.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Reflection; +using Orchard.Extensions.Models; namespace Orchard.Extensions.Loaders { public class CoreExtensionLoader : IExtensionLoader { diff --git a/src/Orchard/Extensions/Loaders/DynamicExtensionLoader.cs b/src/Orchard/Extensions/Loaders/DynamicExtensionLoader.cs index 51ec482b1..2e0e95394 100644 --- a/src/Orchard/Extensions/Loaders/DynamicExtensionLoader.cs +++ b/src/Orchard/Extensions/Loaders/DynamicExtensionLoader.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Reflection; using System.Web.Compilation; using System.Web.Hosting; +using Orchard.Extensions.Models; namespace Orchard.Extensions.Loaders { public class DynamicExtensionLoader : IExtensionLoader { diff --git a/src/Orchard/Extensions/Loaders/IExtensionLoader.cs b/src/Orchard/Extensions/Loaders/IExtensionLoader.cs index a2d508b9a..aefbe4ac4 100644 --- a/src/Orchard/Extensions/Loaders/IExtensionLoader.cs +++ b/src/Orchard/Extensions/Loaders/IExtensionLoader.cs @@ -1,4 +1,6 @@ -namespace Orchard.Extensions.Loaders { +using Orchard.Extensions.Models; + +namespace Orchard.Extensions.Loaders { public interface IExtensionLoader { int Order { get; } ExtensionEntry Load(ExtensionDescriptor descriptor); diff --git a/src/Orchard/Extensions/Loaders/PrecompiledExtensionLoader.cs b/src/Orchard/Extensions/Loaders/PrecompiledExtensionLoader.cs index 1461a85c1..1a9bad5cd 100644 --- a/src/Orchard/Extensions/Loaders/PrecompiledExtensionLoader.cs +++ b/src/Orchard/Extensions/Loaders/PrecompiledExtensionLoader.cs @@ -1,4 +1,6 @@ -namespace Orchard.Extensions.Loaders { +using Orchard.Extensions.Models; + +namespace Orchard.Extensions.Loaders { public class PrecompiledExtensionLoader : IExtensionLoader { public int Order { get { return 3; } } diff --git a/src/Orchard/Extensions/Loaders/ReferencedExtensionLoader.cs b/src/Orchard/Extensions/Loaders/ReferencedExtensionLoader.cs index 1ea51257f..eb90dd76d 100644 --- a/src/Orchard/Extensions/Loaders/ReferencedExtensionLoader.cs +++ b/src/Orchard/Extensions/Loaders/ReferencedExtensionLoader.cs @@ -2,6 +2,7 @@ using System.Reflection; using System.Web.Compilation; using System.Web.Hosting; +using Orchard.Extensions.Models; namespace Orchard.Extensions.Loaders { public class ReferencedExtensionLoader : IExtensionLoader { diff --git a/src/Orchard/Extensions/Models/Extension.cs b/src/Orchard/Extensions/Models/Extension.cs new file mode 100644 index 000000000..314938c58 --- /dev/null +++ b/src/Orchard/Extensions/Models/Extension.cs @@ -0,0 +1,4 @@ +namespace Orchard.Extensions.Models { + public class Extension { + } +} diff --git a/src/Orchard/Extensions/ExtensionDescriptor.cs b/src/Orchard/Extensions/Models/ExtensionDescriptor.cs similarity index 93% rename from src/Orchard/Extensions/ExtensionDescriptor.cs rename to src/Orchard/Extensions/Models/ExtensionDescriptor.cs index d5b960d9b..6583255c7 100644 --- a/src/Orchard/Extensions/ExtensionDescriptor.cs +++ b/src/Orchard/Extensions/Models/ExtensionDescriptor.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Orchard.Extensions { +namespace Orchard.Extensions.Models { public class ExtensionDescriptor { /// /// Virtual path base, "~/Themes", "~/Modules", or "~/Core" @@ -29,4 +29,4 @@ namespace Orchard.Extensions { public IEnumerable Features { get; set; } } -} +} \ No newline at end of file diff --git a/src/Orchard/Extensions/Models/Feature.cs b/src/Orchard/Extensions/Models/Feature.cs new file mode 100644 index 000000000..feb996dd6 --- /dev/null +++ b/src/Orchard/Extensions/Models/Feature.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace Orchard.Extensions.Models { + public class Feature { + public FeatureDescriptor FeatureDescriptor { get; set; } + public Extension Extension { get; set; } + public IEnumerable ExportedTypes { get; set; } + } +} diff --git a/src/Orchard/Extensions/FeatureDescriptor.cs b/src/Orchard/Extensions/Models/FeatureDescriptor.cs similarity index 100% rename from src/Orchard/Extensions/FeatureDescriptor.cs rename to src/Orchard/Extensions/Models/FeatureDescriptor.cs diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 930131333..ffc8143d4 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -189,8 +189,10 @@ - + + + @@ -271,7 +273,7 @@ - + diff --git a/src/Orchard/Themes/ExtensionManagerExtensions.cs b/src/Orchard/Themes/ExtensionManagerExtensions.cs index 7f75cc60b..c0b039d87 100644 --- a/src/Orchard/Themes/ExtensionManagerExtensions.cs +++ b/src/Orchard/Themes/ExtensionManagerExtensions.cs @@ -1,6 +1,7 @@ using System.IO; using System.Linq; using Orchard.Extensions; +using Orchard.Extensions.Models; namespace Orchard.Themes { public static class ExtensionManagerExtensions {