mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
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
This commit is contained in:
@@ -1,7 +1,13 @@
|
|||||||
using Orchard.Tasks;
|
using Orchard.Tasks;
|
||||||
|
|
||||||
namespace Orchard.Commands {
|
namespace Orchard.Commands {
|
||||||
public class CommandBackgroundService : IBackgroundService {
|
/// <summary>
|
||||||
|
/// 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).
|
||||||
|
/// </summary>
|
||||||
|
internal class CommandBackgroundService : IBackgroundService {
|
||||||
public void Sweep() {
|
public void Sweep() {
|
||||||
// Don't run any background service in command line
|
// Don't run any background service in command line
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using System.Linq;
|
|||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
using System.Web.Routing;
|
using System.Web.Routing;
|
||||||
using Autofac;
|
using Autofac;
|
||||||
|
using Orchard.Caching;
|
||||||
using Orchard.Environment;
|
using Orchard.Environment;
|
||||||
using Orchard.Environment.Configuration;
|
using Orchard.Environment.Configuration;
|
||||||
using Orchard.Environment.State;
|
using Orchard.Environment.State;
|
||||||
@@ -152,9 +153,24 @@ namespace Orchard.Commands {
|
|||||||
|
|
||||||
protected void ContainerRegistrations(ContainerBuilder builder) {
|
protected void ContainerRegistrations(ContainerBuilder builder) {
|
||||||
MvcSingletons(builder);
|
MvcSingletons(builder);
|
||||||
builder.RegisterType<CommandHostEnvironment>().As<IHostEnvironment>();
|
|
||||||
builder.RegisterType<CommandBackgroundService>().As<IBackgroundService>();
|
builder.RegisterType<CommandHostEnvironment>().As<IHostEnvironment>().SingleInstance();
|
||||||
builder.RegisterType<CommandHostVirtualPathMonitor>().As<IVirtualPathMonitor>();
|
builder.RegisterType<CommandHostVirtualPathMonitor>().As<IVirtualPathMonitor>().As<IVolatileProvider>().SingleInstance();
|
||||||
|
builder.RegisterInstance(CreateShellRegistrations()).As<IShellContainerRegistrations>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private CommandHostShellContainerRegistrations CreateShellRegistrations() {
|
||||||
|
return new CommandHostShellContainerRegistrations {
|
||||||
|
Registrations = shellBuilder => {
|
||||||
|
shellBuilder.RegisterType<CommandHostVirtualPathMonitor>()
|
||||||
|
.As<IVirtualPathMonitor>()
|
||||||
|
.As<IVolatileProvider>()
|
||||||
|
.InstancePerMatchingLifetimeScope("shell");
|
||||||
|
shellBuilder.RegisterType<CommandBackgroundService>()
|
||||||
|
.As<IBackgroundService>()
|
||||||
|
.InstancePerLifetimeScope();
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void MvcSingletons(ContainerBuilder builder) {
|
protected void MvcSingletons(ContainerBuilder builder) {
|
||||||
@@ -164,5 +180,9 @@ namespace Orchard.Commands {
|
|||||||
builder.RegisterInstance(ModelMetadataProviders.Current);
|
builder.RegisterInstance(ModelMetadataProviders.Current);
|
||||||
builder.RegisterInstance(ViewEngines.Engines);
|
builder.RegisterInstance(ViewEngines.Engines);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class CommandHostShellContainerRegistrations : IShellContainerRegistrations {
|
||||||
|
public Action<ContainerBuilder> Registrations { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using Orchard.Environment;
|
|||||||
using Orchard.Localization;
|
using Orchard.Localization;
|
||||||
|
|
||||||
namespace Orchard.Commands {
|
namespace Orchard.Commands {
|
||||||
public class CommandHostEnvironment : IHostEnvironment {
|
internal class CommandHostEnvironment : IHostEnvironment {
|
||||||
public CommandHostEnvironment() {
|
public CommandHostEnvironment() {
|
||||||
T = NullLocalizer.Instance;
|
T = NullLocalizer.Instance;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
using Orchard.Caching;
|
using Orchard.Caching;
|
||||||
using Orchard.FileSystems.VirtualPath;
|
using Orchard.FileSystems.VirtualPath;
|
||||||
|
|
||||||
namespace Orchard.Commands {
|
namespace Orchard.Commands {
|
||||||
public class CommandHostVirtualPathMonitor : IVirtualPathMonitor {
|
/// <summary>
|
||||||
|
/// 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).
|
||||||
|
/// </summary>
|
||||||
|
internal class CommandHostVirtualPathMonitor : IVirtualPathMonitor {
|
||||||
private readonly IVirtualPathProvider _virtualPathProvider;
|
private readonly IVirtualPathProvider _virtualPathProvider;
|
||||||
|
|
||||||
public CommandHostVirtualPathMonitor(IVirtualPathProvider virtualPathProvider) {
|
public CommandHostVirtualPathMonitor(IVirtualPathProvider virtualPathProvider) {
|
||||||
|
|||||||
16
src/Orchard/Environment/IShellContainerRegistrations.cs
Normal file
16
src/Orchard/Environment/IShellContainerRegistrations.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using Autofac;
|
||||||
|
|
||||||
|
namespace Orchard.Environment {
|
||||||
|
public interface IShellContainerRegistrations {
|
||||||
|
Action<ContainerBuilder> Registrations { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ShellContainerRegistrations : IShellContainerRegistrations {
|
||||||
|
public ShellContainerRegistrations() {
|
||||||
|
Registrations = builder => { return; };
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action<ContainerBuilder> Registrations { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@ using System.Web.Hosting;
|
|||||||
using Autofac;
|
using Autofac;
|
||||||
using Autofac.Configuration;
|
using Autofac.Configuration;
|
||||||
using Orchard.Caching;
|
using Orchard.Caching;
|
||||||
using Orchard.Data;
|
|
||||||
using Orchard.Environment.AutofacUtil;
|
using Orchard.Environment.AutofacUtil;
|
||||||
using Orchard.Environment.Configuration;
|
using Orchard.Environment.Configuration;
|
||||||
using Orchard.Environment.Extensions;
|
using Orchard.Environment.Extensions;
|
||||||
@@ -63,6 +62,7 @@ namespace Orchard.Environment {
|
|||||||
.As<ICompositionStrategy>()
|
.As<ICompositionStrategy>()
|
||||||
.SingleInstance();
|
.SingleInstance();
|
||||||
{
|
{
|
||||||
|
builder.RegisterType<ShellContainerRegistrations>().As<IShellContainerRegistrations>().SingleInstance();
|
||||||
builder.RegisterType<ExtensionLoaderCoordinator>().As<IExtensionLoaderCoordinator>().SingleInstance();
|
builder.RegisterType<ExtensionLoaderCoordinator>().As<IExtensionLoaderCoordinator>().SingleInstance();
|
||||||
builder.RegisterType<ExtensionManager>().As<IExtensionManager>().SingleInstance();
|
builder.RegisterType<ExtensionManager>().As<IExtensionManager>().SingleInstance();
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,9 +23,11 @@ namespace Orchard.Environment.ShellBuilders {
|
|||||||
|
|
||||||
public class ShellContainerFactory : IShellContainerFactory {
|
public class ShellContainerFactory : IShellContainerFactory {
|
||||||
private readonly ILifetimeScope _lifetimeScope;
|
private readonly ILifetimeScope _lifetimeScope;
|
||||||
|
private readonly IShellContainerRegistrations _shellContainerRegistrations;
|
||||||
|
|
||||||
public ShellContainerFactory(ILifetimeScope lifetimeScope) {
|
public ShellContainerFactory(ILifetimeScope lifetimeScope, IShellContainerRegistrations shellContainerRegistrations) {
|
||||||
_lifetimeScope = lifetimeScope;
|
_lifetimeScope = lifetimeScope;
|
||||||
|
_shellContainerRegistrations = shellContainerRegistrations;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ILifetimeScope CreateContainer(ShellSettings settings, ShellBlueprint blueprint) {
|
public ILifetimeScope CreateContainer(ShellSettings settings, ShellBlueprint blueprint) {
|
||||||
@@ -95,6 +97,9 @@ namespace Orchard.Environment.ShellBuilders {
|
|||||||
.InjectActionInvoker();
|
.InjectActionInvoker();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Register code-only registrations specific to a shell
|
||||||
|
_shellContainerRegistrations.Registrations(builder);
|
||||||
|
|
||||||
var optionalShellConfig = HostingEnvironment.MapPath("~/Config/Sites.config");
|
var optionalShellConfig = HostingEnvironment.MapPath("~/Config/Sites.config");
|
||||||
if (File.Exists(optionalShellConfig))
|
if (File.Exists(optionalShellConfig))
|
||||||
builder.RegisterModule(new ConfigurationSettingsReader(ConfigurationSettingsReader.DefaultSectionName, optionalShellConfig));
|
builder.RegisterModule(new ConfigurationSettingsReader(ConfigurationSettingsReader.DefaultSectionName, optionalShellConfig));
|
||||||
|
|||||||
@@ -368,6 +368,7 @@
|
|||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="ContentManagement\DataMigrations\FrameworkDataMigration.cs" />
|
<Compile Include="ContentManagement\DataMigrations\FrameworkDataMigration.cs" />
|
||||||
|
<Compile Include="Environment\IShellContainerRegistrations.cs" />
|
||||||
<Compile Include="FileSystems\Dependencies\DynamicModuleVirtualPathProvider.cs" />
|
<Compile Include="FileSystems\Dependencies\DynamicModuleVirtualPathProvider.cs" />
|
||||||
<Compile Include="Services\IHtmlFilter.cs" />
|
<Compile Include="Services\IHtmlFilter.cs" />
|
||||||
<Compile Include="Utility\Hash.cs" />
|
<Compile Include="Utility\Hash.cs" />
|
||||||
|
|||||||
Reference in New Issue
Block a user