diff --git a/src/Orchard/Commands/CommandHostAgent.cs b/src/Orchard/Commands/CommandHostAgent.cs index cf06a0ec5..dbf2cbadf 100644 --- a/src/Orchard/Commands/CommandHostAgent.cs +++ b/src/Orchard/Commands/CommandHostAgent.cs @@ -17,22 +17,24 @@ namespace Orchard.Commands { /// public class CommandHostAgent { private IContainer _hostContainer; + private Dictionary _tenants; - public int RunSingleCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary switches) { - int result = StartHost(input, output); - if (result != 0) - return result; + public int RunSingleCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary switches) { + int result = StartHost(input, output); + if (result != 0) + return result; - result = RunCommand(input, output, tenant, args, switches); - if (result != 0) - return result; + result = RunCommand(input, output, tenant, args, switches); + if (result != 0) + return result; - return StopHost(input, output); + return StopHost(input, output); } public int StartHost(TextReader input, TextWriter output) { try { _hostContainer = OrchardStarter.CreateHostContainer(MvcSingletons); + _tenants = new Dictionary(); var host = _hostContainer.Resolve(); host.Initialize(); @@ -50,8 +52,12 @@ namespace Orchard.Commands { public int StopHost(TextReader input, TextWriter output) { try { - // + foreach (var tenant in _tenants.Values) { + tenant.Dispose(); + } _hostContainer.Dispose(); + + _tenants = null; _hostContainer = null; return 0; } @@ -66,23 +72,18 @@ namespace Orchard.Commands { public int RunCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary switches) { try { - var host = _hostContainer.Resolve(); + tenant = tenant ?? "Default"; - // Find tenant (or default) - tenant = tenant ?? "default"; - var tenantManager = _hostContainer.Resolve(); - var tenantSettings = tenantManager.LoadSettings().Single(s => String.Equals(s.Name, tenant, StringComparison.OrdinalIgnoreCase)); + var env = FindOrCreateTenant(tenant); - // Disptach command execution to ICommandManager - using (var env = host.CreateStandaloneEnvironment(tenantSettings)) { - var parameters = new CommandParameters { - Arguments = args, - Switches = switches, - Input = input, - Output = output - }; - env.Resolve().Execute(parameters); - } + var parameters = new CommandParameters { + Arguments = args, + Switches = switches, + Input = input, + Output = output + }; + + env.Resolve().Execute(parameters); return 0; } @@ -95,6 +96,19 @@ namespace Orchard.Commands { } } + public IStandaloneEnvironment FindOrCreateTenant(string tenant) { + if (!_tenants.ContainsKey(tenant)) { + var host = _hostContainer.Resolve(); + var tenantManager = _hostContainer.Resolve(); + var tenantSettings = tenantManager.LoadSettings().Single(s => String.Equals(s.Name, tenant, StringComparison.OrdinalIgnoreCase)); + var env = host.CreateStandaloneEnvironment(tenantSettings); + + _tenants.Add(tenant, env); + } + return _tenants[tenant]; + } + + protected void MvcSingletons(ContainerBuilder builder) { builder.RegisterInstance(ControllerBuilder.Current); builder.RegisterInstance(RouteTable.Routes);