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
+