From a2ee8eff709624d11d0e28c0fe12ee8c69f7dc89 Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Thu, 29 Jul 2010 19:09:48 -0700 Subject: [PATCH] Fix background tasks processing on command line * Don't run background tasks in orchard command line host * Run background tasks in WebApp host This required introducing the notion of "ShellRegistrations" through a new IShellContainerRegistrations insterface, which is executed everytime a new shell container is created, so that a host (e.g. command line in this case) has the ability to override default IXxxDependency registrations. --HG-- branch : dev --- .../Commands/CommandBackgroundService.cs | 8 +++++- src/Orchard/Commands/CommandHostAgent.cs | 26 ++++++++++++++++--- .../Commands/CommandHostEnvironment.cs | 2 +- .../Commands/CommandHostVirtualPathMonitor.cs | 10 ++++--- .../IShellContainerRegistrations.cs | 16 ++++++++++++ src/Orchard/Environment/OrchardStarter.cs | 2 +- .../ShellBuilders/ShellContainerFactory.cs | 7 ++++- src/Orchard/Orchard.Framework.csproj | 1 + 8 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 src/Orchard/Environment/IShellContainerRegistrations.cs diff --git a/src/Orchard/Commands/CommandBackgroundService.cs b/src/Orchard/Commands/CommandBackgroundService.cs index 9bee41ec3..798eaf1ef 100644 --- a/src/Orchard/Commands/CommandBackgroundService.cs +++ b/src/Orchard/Commands/CommandBackgroundService.cs @@ -1,7 +1,13 @@ using Orchard.Tasks; namespace Orchard.Commands { - public class CommandBackgroundService : IBackgroundService { + /// + /// Command line specific "no-op" background service implementation. + /// Note that we make this class "internal" so that it's not auto-registered + /// by the Orchard Framework (it is registered explicitly by the command + /// line host). + /// + internal class CommandBackgroundService : IBackgroundService { public void Sweep() { // Don't run any background service in command line } diff --git a/src/Orchard/Commands/CommandHostAgent.cs b/src/Orchard/Commands/CommandHostAgent.cs index 0177b9a24..cdb103525 100644 --- a/src/Orchard/Commands/CommandHostAgent.cs +++ b/src/Orchard/Commands/CommandHostAgent.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Web.Mvc; using System.Web.Routing; using Autofac; +using Orchard.Caching; using Orchard.Environment; using Orchard.Environment.Configuration; using Orchard.Environment.State; @@ -152,9 +153,24 @@ namespace Orchard.Commands { protected void ContainerRegistrations(ContainerBuilder builder) { MvcSingletons(builder); - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType().As(); + + builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().As().SingleInstance(); + builder.RegisterInstance(CreateShellRegistrations()).As(); + } + + private CommandHostShellContainerRegistrations CreateShellRegistrations() { + return new CommandHostShellContainerRegistrations { + Registrations = shellBuilder => { + shellBuilder.RegisterType() + .As() + .As() + .InstancePerMatchingLifetimeScope("shell"); + shellBuilder.RegisterType() + .As() + .InstancePerLifetimeScope(); + } + }; } protected void MvcSingletons(ContainerBuilder builder) { @@ -164,5 +180,9 @@ namespace Orchard.Commands { builder.RegisterInstance(ModelMetadataProviders.Current); builder.RegisterInstance(ViewEngines.Engines); } + + private class CommandHostShellContainerRegistrations : IShellContainerRegistrations { + public Action Registrations { get; set; } + } } } diff --git a/src/Orchard/Commands/CommandHostEnvironment.cs b/src/Orchard/Commands/CommandHostEnvironment.cs index 23153b06c..8a79ff81d 100644 --- a/src/Orchard/Commands/CommandHostEnvironment.cs +++ b/src/Orchard/Commands/CommandHostEnvironment.cs @@ -5,7 +5,7 @@ using Orchard.Environment; using Orchard.Localization; namespace Orchard.Commands { - public class CommandHostEnvironment : IHostEnvironment { + internal class CommandHostEnvironment : IHostEnvironment { public CommandHostEnvironment() { T = NullLocalizer.Instance; } diff --git a/src/Orchard/Commands/CommandHostVirtualPathMonitor.cs b/src/Orchard/Commands/CommandHostVirtualPathMonitor.cs index 7b83fac7c..b1068ead7 100644 --- a/src/Orchard/Commands/CommandHostVirtualPathMonitor.cs +++ b/src/Orchard/Commands/CommandHostVirtualPathMonitor.cs @@ -1,12 +1,16 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using Orchard.Caching; using Orchard.FileSystems.VirtualPath; namespace Orchard.Commands { - public class CommandHostVirtualPathMonitor : IVirtualPathMonitor { + /// + /// Command line specific virtual path monitor. + /// Note that we make this class "internal" so that it's not auto-registered + /// by the Orchard Framework (it is registered explicitly by the command + /// line host). + /// + internal class CommandHostVirtualPathMonitor : IVirtualPathMonitor { private readonly IVirtualPathProvider _virtualPathProvider; public CommandHostVirtualPathMonitor(IVirtualPathProvider virtualPathProvider) { diff --git a/src/Orchard/Environment/IShellContainerRegistrations.cs b/src/Orchard/Environment/IShellContainerRegistrations.cs new file mode 100644 index 000000000..b151804e5 --- /dev/null +++ b/src/Orchard/Environment/IShellContainerRegistrations.cs @@ -0,0 +1,16 @@ +using System; +using Autofac; + +namespace Orchard.Environment { + public interface IShellContainerRegistrations { + Action Registrations { get; } + } + + public class ShellContainerRegistrations : IShellContainerRegistrations { + public ShellContainerRegistrations() { + Registrations = builder => { return; }; + } + + public Action Registrations { get; private set; } + } +} diff --git a/src/Orchard/Environment/OrchardStarter.cs b/src/Orchard/Environment/OrchardStarter.cs index 4854baa83..7390b09d3 100644 --- a/src/Orchard/Environment/OrchardStarter.cs +++ b/src/Orchard/Environment/OrchardStarter.cs @@ -6,7 +6,6 @@ using System.Web.Hosting; using Autofac; using Autofac.Configuration; using Orchard.Caching; -using Orchard.Data; using Orchard.Environment.AutofacUtil; using Orchard.Environment.Configuration; using Orchard.Environment.Extensions; @@ -63,6 +62,7 @@ namespace Orchard.Environment { .As() .SingleInstance(); { + builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); { diff --git a/src/Orchard/Environment/ShellBuilders/ShellContainerFactory.cs b/src/Orchard/Environment/ShellBuilders/ShellContainerFactory.cs index eda04c918..dabebbdb2 100644 --- a/src/Orchard/Environment/ShellBuilders/ShellContainerFactory.cs +++ b/src/Orchard/Environment/ShellBuilders/ShellContainerFactory.cs @@ -23,9 +23,11 @@ namespace Orchard.Environment.ShellBuilders { public class ShellContainerFactory : IShellContainerFactory { private readonly ILifetimeScope _lifetimeScope; + private readonly IShellContainerRegistrations _shellContainerRegistrations; - public ShellContainerFactory(ILifetimeScope lifetimeScope) { + public ShellContainerFactory(ILifetimeScope lifetimeScope, IShellContainerRegistrations shellContainerRegistrations) { _lifetimeScope = lifetimeScope; + _shellContainerRegistrations = shellContainerRegistrations; } public ILifetimeScope CreateContainer(ShellSettings settings, ShellBlueprint blueprint) { @@ -95,6 +97,9 @@ namespace Orchard.Environment.ShellBuilders { .InjectActionInvoker(); } + // Register code-only registrations specific to a shell + _shellContainerRegistrations.Registrations(builder); + var optionalShellConfig = HostingEnvironment.MapPath("~/Config/Sites.config"); if (File.Exists(optionalShellConfig)) builder.RegisterModule(new ConfigurationSettingsReader(ConfigurationSettingsReader.DefaultSectionName, optionalShellConfig)); diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 2969c3374..9251df55f 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -368,6 +368,7 @@ Code +