From 79fe90356b8b7b8f8396219d0fff3718ce55fe46 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 4 Feb 2010 19:47:24 -0800 Subject: [PATCH] Adding a Setup mode shell container factory Minimum profile of services needed to function are registered Certain services are provided by hardcoded replacements implemented only for this context --HG-- branch : dev --- .../Environment/DefaultOrchardHostTests.cs | 2 +- .../Environment/DefaultOrchardShellTests.cs | 1 - .../SetupShellContainerFactoryTests.cs | 45 +++++ src/Orchard.Tests/Orchard.Tests.csproj | 1 + .../Core/Setup/Controllers/SetupController.cs | 5 +- src/Orchard/Environment/DefaultOrchardHost.cs | 130 ++++----------- .../Environment/DefaultOrchardShell.cs | 3 - .../ExtensibleInterceptionModule.cs | 27 +++ src/Orchard/Environment/IOrchardHost.cs | 1 - src/Orchard/Environment/OrchardStarter.cs | 11 +- .../DefaultShellContainerFactory.cs | 65 ++++++++ .../ShellBuilders/IShellContainerFactory.cs | 7 + .../SetupShellContainerFactory.cs | 157 ++++++++++++++++++ .../ShellBuilders/ShellSettings.cs | 13 ++ src/Orchard/Extensions/ExtensionManager.cs | 4 + .../Mvc/ViewEngines/ViewEngineFilter.cs | 1 + .../ViewEngines/WebFormsViewEngineProvider.cs | 6 +- src/Orchard/Orchard.csproj | 5 + 18 files changed, 367 insertions(+), 117 deletions(-) create mode 100644 src/Orchard.Tests/Environment/ShellBuilders/SetupShellContainerFactoryTests.cs create mode 100644 src/Orchard/Environment/ExtensibleInterceptionModule.cs create mode 100644 src/Orchard/Environment/ShellBuilders/DefaultShellContainerFactory.cs create mode 100644 src/Orchard/Environment/ShellBuilders/IShellContainerFactory.cs create mode 100644 src/Orchard/Environment/ShellBuilders/SetupShellContainerFactory.cs create mode 100644 src/Orchard/Environment/ShellBuilders/ShellSettings.cs diff --git a/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs b/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs index 1a6c51dfc..6c6b69a4d 100644 --- a/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs +++ b/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs @@ -96,7 +96,7 @@ namespace Orchard.Tests.Environment { [Test] public void DifferentShellInstanceShouldBeReturnedAfterEachCreate() { - var host = _container.Resolve(); + var host = (DefaultOrchardHost)_container.Resolve(); var runtime1 = host.CreateShell(); var runtime2 = host.CreateShell(); Assert.That(runtime1, Is.Not.SameAs(runtime2)); diff --git a/src/Orchard.Tests/Environment/DefaultOrchardShellTests.cs b/src/Orchard.Tests/Environment/DefaultOrchardShellTests.cs index 68a40dd47..376deb182 100644 --- a/src/Orchard.Tests/Environment/DefaultOrchardShellTests.cs +++ b/src/Orchard.Tests/Environment/DefaultOrchardShellTests.cs @@ -37,7 +37,6 @@ namespace Orchard.Tests.Environment { new[] { modelBinderProvider1, modelBinderProvider2 }, modelBinderPublisher, new ViewEngineCollection { new WebFormViewEngine() }, - new Moq.Mock().Object, Enumerable.Empty()); runtime.Activate(); diff --git a/src/Orchard.Tests/Environment/ShellBuilders/SetupShellContainerFactoryTests.cs b/src/Orchard.Tests/Environment/ShellBuilders/SetupShellContainerFactoryTests.cs new file mode 100644 index 000000000..03f1fe98e --- /dev/null +++ b/src/Orchard.Tests/Environment/ShellBuilders/SetupShellContainerFactoryTests.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; +using System.Linq; +using System.Web.Mvc; +using System.Web.Routing; +using Autofac; +using NUnit.Framework; +using Orchard.Environment; +using Orchard.Environment.ShellBuilders; +using Orchard.Mvc.Filters; +using Orchard.Mvc.ViewEngines; + +namespace Orchard.Tests.Environment.ShellBuilders { + [TestFixture] + public class SetupShellContainerFactoryTests { + private IContainer _hostContainer; + + [SetUp] + public void Init() { + _hostContainer = OrchardStarter.CreateHostContainer(builder => { + builder.Register(new ViewEngineCollection()); + builder.Register(new RouteCollection()); + builder.Register(new ModelBinderDictionary()); + }); + } + + [Test] + public void FactoryShouldCreateContainerThatProvidesShell() { + + var factory = new SetupShellContainerFactory(_hostContainer); + var shellContainer = factory.CreateContainer(null); + Assert.That(shellContainer, Is.Not.Null); + var shell = shellContainer.Resolve(); + Assert.That(shell, Is.Not.Null); + } + + [Test] + public void ShellContainerShouldProvideLayoutViewEngine() { + var factory = new SetupShellContainerFactory(_hostContainer); + var shellContainer = factory.CreateContainer(null); + var viewEngineFilter = shellContainer.Resolve>() + .Single(f=>f is ViewEngineFilter); + Assert.That(viewEngineFilter, Is.Not.Null); + } + } +} diff --git a/src/Orchard.Tests/Orchard.Tests.csproj b/src/Orchard.Tests/Orchard.Tests.csproj index 7e66bf79b..bb5c16483 100644 --- a/src/Orchard.Tests/Orchard.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Tests.csproj @@ -141,6 +141,7 @@ + diff --git a/src/Orchard.Web/Core/Setup/Controllers/SetupController.cs b/src/Orchard.Web/Core/Setup/Controllers/SetupController.cs index d34132777..f2a2a7524 100644 --- a/src/Orchard.Web/Core/Setup/Controllers/SetupController.cs +++ b/src/Orchard.Web/Core/Setup/Controllers/SetupController.cs @@ -6,11 +6,8 @@ using Orchard.Logging; namespace Orchard.Core.Setup.Controllers { public class SetupController : Controller { - private readonly ISetupService _setupService; - public SetupController(IOrchardServices services, ISetupService setupService) { - _setupService = setupService; - Services = services; + public SetupController() { Logger = NullLogger.Instance; T = NullLocalizer.Instance; } diff --git a/src/Orchard/Environment/DefaultOrchardHost.cs b/src/Orchard/Environment/DefaultOrchardHost.cs index e6e109156..cc0ad4c44 100644 --- a/src/Orchard/Environment/DefaultOrchardHost.cs +++ b/src/Orchard/Environment/DefaultOrchardHost.cs @@ -7,6 +7,7 @@ using Autofac.Builder; using Autofac.Integration.Web; using System.Collections.Generic; using AutofacContrib.DynamicProxy2; +using Orchard.Environment.ShellBuilders; using Orchard.Extensions; using Orchard.Mvc; using Orchard.Mvc.ViewEngines; @@ -14,22 +15,20 @@ using Orchard.Tasks; namespace Orchard.Environment { public class DefaultOrchardHost : IOrchardHost { - private readonly IContainer _container; private readonly IContainerProvider _containerProvider; - private readonly ICompositionStrategy _compositionStrategy; private readonly ControllerBuilder _controllerBuilder; + private readonly IEnumerable _shellContainerFactories; private IOrchardShell _current; public DefaultOrchardHost( IContainerProvider containerProvider, - ICompositionStrategy compositionStrategy, - ControllerBuilder controllerBuilder) { - _container = containerProvider.ApplicationContainer; + ControllerBuilder controllerBuilder, + IEnumerable shellContainerFactories) { _containerProvider = containerProvider; - _compositionStrategy = compositionStrategy; _controllerBuilder = controllerBuilder; + _shellContainerFactories = shellContainerFactories; } @@ -37,6 +36,13 @@ namespace Orchard.Environment { get { return _current; } } + void IOrchardHost.Initialize() { + Initialize(); + } + void IOrchardHost.EndRequest() { + EndRequest(); + } + protected virtual void Initialize() { var shellContainer = CreateShellContainer(); var shell = shellContainer.Resolve(); @@ -54,6 +60,25 @@ namespace Orchard.Environment { HackSimulateExtensionActivation(shellContainer); } + + protected virtual void EndRequest() { + _containerProvider.DisposeRequestContainer(); + } + + + public virtual IOrchardShell CreateShell() { + return CreateShellContainer().Resolve(); + } + + public virtual IContainer CreateShellContainer() { + foreach(var factory in _shellContainerFactories) { + var container = factory.CreateContainer(null); + if (container != null) + return container; + } + return null; + } + private void HackInstallSimulation() { var tempContainer = CreateShellContainer(); var containerProvider = new FiniteContainerProvider(tempContainer); @@ -83,98 +108,5 @@ namespace Orchard.Environment { } } - protected virtual void EndRequest() { - _containerProvider.DisposeRequestContainer(); - } - - - protected virtual IOrchardShell CreateShell() { - var shellContainer = CreateShellContainer(); - - return shellContainer.Resolve(); - } - - public virtual IContainer CreateShellContainer() { - // add module types to container being built - var addingModulesAndServices = new ContainerBuilder(); - foreach (var moduleType in _compositionStrategy.GetModuleTypes()) { - addingModulesAndServices.Register(moduleType).As().ContainerScoped(); - } - - // add components by the IDependency interfaces they expose - foreach (var serviceType in _compositionStrategy.GetDependencyTypes()) { - foreach (var interfaceType in serviceType.GetInterfaces()) { - if (typeof(IDependency).IsAssignableFrom(interfaceType)) { - var registrar = addingModulesAndServices.Register(serviceType).As(interfaceType); - if (typeof(ISingletonDependency).IsAssignableFrom(interfaceType)) { - registrar.SingletonScoped(); - } - else if (typeof(ITransientDependency).IsAssignableFrom(interfaceType)) { - registrar.FactoryScoped(); - } - else { - registrar.ContainerScoped(); - } - } - } - } - - var shellContainer = _container.CreateInnerContainer(); - shellContainer.TagWith("shell"); - addingModulesAndServices.Build(shellContainer); - - // instantiate and register modules on container being built - var modules = shellContainer.Resolve>(); - var addingModules = new ContainerBuilder(); - foreach (var module in modules) { - addingModules.RegisterModule(module); - } - addingModules.RegisterModule(new ExtensibleInterceptionModule(modules.OfType())); - addingModules.Build(shellContainer); - - - - //foreach (var reg in shellContainer.ComponentRegistrations) { - // reg.Preparing += (s, e) => { - // Debug.WriteLine(e.Component.Descriptor.BestKnownImplementationType.FullName); - // }; - //} - - return shellContainer; - } - - #region IOrchardHost Members - - void IOrchardHost.Initialize() { - Initialize(); - } - void IOrchardHost.EndRequest() { - EndRequest(); - } - IOrchardShell IOrchardHost.CreateShell() { - return CreateShell(); - } - #endregion - } - - public class ExtensibleInterceptionModule : InterceptionModule { - public ExtensibleInterceptionModule(IEnumerable providers) - : base(new CombinedProvider(providers.Concat(new[] { new FlexibleInterceptorProvider() })), new FlexibleInterceptorAttacher()) { - } - - class CombinedProvider : IComponentInterceptorProvider { - private readonly IEnumerable _providers; - - public CombinedProvider(IEnumerable providers) { - _providers = providers; - } - - public IEnumerable GetInterceptorServices(IComponentDescriptor descriptor) { - return _providers - .SelectMany(x => x.GetInterceptorServices(descriptor)) - .Distinct() - .ToList(); - } - } } } \ No newline at end of file diff --git a/src/Orchard/Environment/DefaultOrchardShell.cs b/src/Orchard/Environment/DefaultOrchardShell.cs index 923dfcb08..847f15f33 100644 --- a/src/Orchard/Environment/DefaultOrchardShell.cs +++ b/src/Orchard/Environment/DefaultOrchardShell.cs @@ -15,7 +15,6 @@ namespace Orchard.Environment { private readonly IEnumerable _modelBinderProviders; private readonly IModelBinderPublisher _modelBinderPublisher; private readonly ViewEngineCollection _viewEngines; - private readonly IExtensionManager _extensionManager; private readonly IEnumerable _events; public DefaultOrchardShell( @@ -24,14 +23,12 @@ namespace Orchard.Environment { IEnumerable modelBinderProviders, IModelBinderPublisher modelBinderPublisher, ViewEngineCollection viewEngines, - IExtensionManager extensionManager, IEnumerable events) { _routeProviders = routeProviders; _routePublisher = routePublisher; _modelBinderProviders = modelBinderProviders; _modelBinderPublisher = modelBinderPublisher; _viewEngines = viewEngines; - _extensionManager = extensionManager; _events = events; Logger = NullLogger.Instance; diff --git a/src/Orchard/Environment/ExtensibleInterceptionModule.cs b/src/Orchard/Environment/ExtensibleInterceptionModule.cs new file mode 100644 index 000000000..1fcab84d9 --- /dev/null +++ b/src/Orchard/Environment/ExtensibleInterceptionModule.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Linq; +using Autofac; +using AutofacContrib.DynamicProxy2; + +namespace Orchard.Environment { + public class ExtensibleInterceptionModule : InterceptionModule { + public ExtensibleInterceptionModule(IEnumerable providers) + : base(new CombinedProvider(providers.Concat(new[] { new FlexibleInterceptorProvider() })), new FlexibleInterceptorAttacher()) { + } + + class CombinedProvider : IComponentInterceptorProvider { + private readonly IEnumerable _providers; + + public CombinedProvider(IEnumerable providers) { + _providers = providers; + } + + public IEnumerable GetInterceptorServices(IComponentDescriptor descriptor) { + return _providers + .SelectMany(x => x.GetInterceptorServices(descriptor)) + .Distinct() + .ToList(); + } + } + } +} \ No newline at end of file diff --git a/src/Orchard/Environment/IOrchardHost.cs b/src/Orchard/Environment/IOrchardHost.cs index c35a19fd7..b68eaa665 100644 --- a/src/Orchard/Environment/IOrchardHost.cs +++ b/src/Orchard/Environment/IOrchardHost.cs @@ -2,6 +2,5 @@ namespace Orchard.Environment { public interface IOrchardHost { void Initialize(); void EndRequest(); - IOrchardShell CreateShell(); } } \ No newline at end of file diff --git a/src/Orchard/Environment/OrchardStarter.cs b/src/Orchard/Environment/OrchardStarter.cs index cea0a1b74..e3883a784 100644 --- a/src/Orchard/Environment/OrchardStarter.cs +++ b/src/Orchard/Environment/OrchardStarter.cs @@ -5,6 +5,7 @@ using Autofac.Builder; using Autofac.Integration.Web; using Autofac.Modules; using AutofacContrib.DynamicProxy2; +using Orchard.Environment.ShellBuilders; using Orchard.Extensions; using Orchard.Extensions.Loaders; @@ -17,12 +18,10 @@ namespace Orchard.Environment { builder.RegisterModule(new ImplicitCollectionSupportModule()); // a single default host implementation is needed for bootstrapping a web app domain - builder.Register().As() - .SingletonScoped(); - builder.Register().As() - .SingletonScoped(); - builder.Register().As() - .ContainerScoped().InContext("shell"); + builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); // The container provider gives you access to the lowest container at the time, // and dynamically creates a per-request container. The DisposeRequestContainer method diff --git a/src/Orchard/Environment/ShellBuilders/DefaultShellContainerFactory.cs b/src/Orchard/Environment/ShellBuilders/DefaultShellContainerFactory.cs new file mode 100644 index 000000000..2027e6f3e --- /dev/null +++ b/src/Orchard/Environment/ShellBuilders/DefaultShellContainerFactory.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; +using System.Linq; +using Autofac; +using Autofac.Builder; +using AutofacContrib.DynamicProxy2; + +namespace Orchard.Environment.ShellBuilders { + public class DefaultShellContainerFactory : IShellContainerFactory { + private readonly IContainer _container; + private readonly ICompositionStrategy _compositionStrategy; + + public DefaultShellContainerFactory(IContainer container, ICompositionStrategy compositionStrategy) { + _container = container; + _compositionStrategy = compositionStrategy; + } + + public virtual IContainer CreateContainer(IShellSettings settings) { + // null settings means we need to defer to the setup container factory + if (settings == null) { + return null; + } + + // add module types to container being built + var addingModulesAndServices = new ContainerBuilder(); + addingModulesAndServices.Register().As().SingletonScoped(); + + foreach (var moduleType in _compositionStrategy.GetModuleTypes()) { + addingModulesAndServices.Register(moduleType).As().ContainerScoped(); + } + + // add components by the IDependency interfaces they expose + foreach (var serviceType in _compositionStrategy.GetDependencyTypes()) { + foreach (var interfaceType in serviceType.GetInterfaces()) { + if (typeof(IDependency).IsAssignableFrom(interfaceType)) { + var registrar = addingModulesAndServices.Register(serviceType).As(interfaceType); + if (typeof(ISingletonDependency).IsAssignableFrom(interfaceType)) { + registrar.SingletonScoped(); + } + else if (typeof(ITransientDependency).IsAssignableFrom(interfaceType)) { + registrar.FactoryScoped(); + } + else { + registrar.ContainerScoped(); + } + } + } + } + + var shellContainer = _container.CreateInnerContainer(); + shellContainer.TagWith("shell"); + addingModulesAndServices.Build(shellContainer); + + // instantiate and register modules on container being built + var modules = shellContainer.Resolve>(); + var addingModules = new ContainerBuilder(); + foreach (var module in modules) { + addingModules.RegisterModule(module); + } + addingModules.RegisterModule(new ExtensibleInterceptionModule(modules.OfType())); + addingModules.Build(shellContainer); + + return shellContainer; + } + } +} diff --git a/src/Orchard/Environment/ShellBuilders/IShellContainerFactory.cs b/src/Orchard/Environment/ShellBuilders/IShellContainerFactory.cs new file mode 100644 index 000000000..2eb1f1d0c --- /dev/null +++ b/src/Orchard/Environment/ShellBuilders/IShellContainerFactory.cs @@ -0,0 +1,7 @@ +using Autofac; + +namespace Orchard.Environment.ShellBuilders { + public interface IShellContainerFactory { + IContainer CreateContainer(IShellSettings settings); + } +} \ No newline at end of file diff --git a/src/Orchard/Environment/ShellBuilders/SetupShellContainerFactory.cs b/src/Orchard/Environment/ShellBuilders/SetupShellContainerFactory.cs new file mode 100644 index 000000000..e57975d47 --- /dev/null +++ b/src/Orchard/Environment/ShellBuilders/SetupShellContainerFactory.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Web.Mvc; +using System.Web.Routing; +using Autofac; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Handlers; +using Orchard.Extensions; +using Orchard.Localization; +using Orchard.Mvc; +using Orchard.Mvc.Filters; +using Orchard.Mvc.ModelBinders; +using Orchard.Mvc.Routes; +using Orchard.Mvc.ViewEngines; +using Orchard.Settings; +using Orchard.Themes; +using Orchard.UI.PageClass; +using Orchard.UI.PageTitle; +using Orchard.UI.Zones; + +namespace Orchard.Environment.ShellBuilders { + public class SetupShellContainerFactory : IShellContainerFactory { + private readonly IContainer _container; + + public SetupShellContainerFactory(IContainer container) { + _container = container; + } + + public IContainer CreateContainer(IShellSettings settings) { + // when you have settings the setup container factory is not in effect + if (settings != null) { + return null; + } + + var shellContainer = _container.CreateInnerContainer(); + + shellContainer.Build(builder => { + builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); + builder.Register(new NullHackInstallationGenerator()).As().SingletonScoped(); + builder.Register(new SetupRouteProvider()).As().SingletonScoped(); + builder.Register().As().SingletonScoped(); + + builder.Register().As().ContainerScoped(); + builder.Register().As().ContainerScoped(); + builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); + builder.Register().As().SingletonScoped(); + }); + + shellContainer.Build(builder => { + foreach (var module in shellContainer.Resolve>()) { + builder.RegisterModule(module); + } + }); + + return shellContainer; + } + + + class SetupRouteProvider : IRouteProvider { + public IEnumerable GetRoutes() { + var routes = new List(); + GetRoutes(routes); + return routes; + } + + public void GetRoutes(ICollection routes) { + routes.Add(new RouteDescriptor { + Priority = 100, + Route = new Route("{controller}/{action}", + new RouteValueDictionary { { "Area", "Setup" }, { "Controller", "Setup" }, { "Action", "Index" } }, + new RouteValueDictionary { { "Area", "Setup" }, { "Controller", "Setup" }, { "Action", "Index" } }, + new RouteValueDictionary { { "Area", "Setup" } }, + new MvcRouteHandler()) + }); + } + } + + class SetupText : IText { + public LocalizedString Get(string textHint, params object[] args) { + if (args == null || args.Length == 0) { + return new LocalizedString(textHint); + } + return new LocalizedString(string.Format(textHint, args)); + } + } + + class SafeModeThemeService : IThemeService { + class SafeModeTheme : ITheme { + public ContentItem ContentItem { get; set; } + public string ThemeName { get; set; } + public string DisplayName { get; set; } + public string Description { get; set; } + public string Version { get; set; } + public string Author { get; set; } + public string HomePage { get; set; } + } + + private readonly SafeModeTheme _theme = new SafeModeTheme { + ThemeName = "SafeMode", + DisplayName = "SafeMode", + }; + + public ITheme GetThemeByName(string themeName) { return _theme; } + public ITheme GetSiteTheme() { return _theme; } + public void SetSiteTheme(string themeName) { } + public ITheme GetRequestTheme(RequestContext requestContext) { return _theme; } + public IEnumerable GetInstalledThemes() { return new[] { _theme }; } + public void InstallTheme(HttpPostedFileBase file) { } + public void UninstallTheme(string themeName) { } + } + + class NullHackInstallationGenerator : IHackInstallationGenerator { + public void GenerateInstallEvents() { } + public void GenerateActivateEvents() { } + } + + class SetupSiteService : ISiteService { + public ISite GetSiteSettings() { + var site = new ContentItemBuilder("site") + .Weld() + .Build(); + + return site.As(); + } + } + + class SetupSite : ContentPart, ISite { + public string PageTitleSeparator { + get { return "*"; } + } + + public string SiteName { + get { return "Orchard Setup"; } + } + + public string SiteSalt { + get { return "42"; } + } + + public string SiteUrl { + get { return "/"; } + } + + public string SuperUser { + get { return ""; } + } + } + } + +} diff --git a/src/Orchard/Environment/ShellBuilders/ShellSettings.cs b/src/Orchard/Environment/ShellBuilders/ShellSettings.cs new file mode 100644 index 000000000..09ed48443 --- /dev/null +++ b/src/Orchard/Environment/ShellBuilders/ShellSettings.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Orchard.Environment.ShellBuilders { + public interface IShellSettings { + } + + public class ShellSettings : IShellSettings { + } + +} diff --git a/src/Orchard/Extensions/ExtensionManager.cs b/src/Orchard/Extensions/ExtensionManager.cs index a6cc0915a..e6c485748 100644 --- a/src/Orchard/Extensions/ExtensionManager.cs +++ b/src/Orchard/Extensions/ExtensionManager.cs @@ -139,6 +139,10 @@ namespace Orchard.Extensions { foreach (var descriptor in AvailableExtensions()) { // Extensions that are Themes don't have buildable components. if (String.Equals(descriptor.ExtensionType, "Package", StringComparison.OrdinalIgnoreCase)) { + + //TEMP!!!! + if (descriptor.DisplayName!="Setup") continue; + yield return BuildEntry(descriptor); } } diff --git a/src/Orchard/Mvc/ViewEngines/ViewEngineFilter.cs b/src/Orchard/Mvc/ViewEngines/ViewEngineFilter.cs index 759124202..232e41456 100644 --- a/src/Orchard/Mvc/ViewEngines/ViewEngineFilter.cs +++ b/src/Orchard/Mvc/ViewEngines/ViewEngineFilter.cs @@ -24,6 +24,7 @@ namespace Orchard.Mvc.ViewEngines { _themeService = themeService; _extensionManager = extensionManager; _viewEngineProviders = viewEngineProviders; + Logger = NullLogger.Instance; } public ILogger Logger { get; set; } diff --git a/src/Orchard/Mvc/ViewEngines/WebFormsViewEngineProvider.cs b/src/Orchard/Mvc/ViewEngines/WebFormsViewEngineProvider.cs index 1beca23ca..7ec75a31b 100644 --- a/src/Orchard/Mvc/ViewEngines/WebFormsViewEngineProvider.cs +++ b/src/Orchard/Mvc/ViewEngines/WebFormsViewEngineProvider.cs @@ -4,7 +4,9 @@ using Orchard.Logging; namespace Orchard.Mvc.ViewEngines { public class WebFormsViewEngineProvider : IViewEngineProvider { - + public WebFormsViewEngineProvider() { + Logger = NullLogger.Instance; + } static string[] DisabledFormats = new[] { "~/Disabled" }; public ILogger Logger { get; set; } @@ -26,7 +28,7 @@ namespace Orchard.Mvc.ViewEngines { ViewLocationFormats = DisabledFormats, AreaMasterLocationFormats = DisabledFormats, AreaViewLocationFormats = DisabledFormats, - AreaPartialViewLocationFormats=DisabledFormats, + AreaPartialViewLocationFormats = DisabledFormats, }; // enable /Views/{partialName} diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index 34d4bba80..9a778cb77 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -133,6 +133,11 @@ + + + + +