Adding tenant cache for response file execution

This is to avoid creating the stand alone environment for each
command when commands use the same tenant.

--HG--
branch : dev
This commit is contained in:
Renaud Paquay
2010-04-27 18:44:48 -07:00
parent 4357fdf2e0
commit cd294c3d90

View File

@@ -17,22 +17,24 @@ namespace Orchard.Commands {
/// </summary>
public class CommandHostAgent {
private IContainer _hostContainer;
private Dictionary<string, IStandaloneEnvironment> _tenants;
public int RunSingleCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary<string,string> switches) {
int result = StartHost(input, output);
if (result != 0)
return result;
public int RunSingleCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary<string, string> 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<string, IStandaloneEnvironment>();
var host = _hostContainer.Resolve<IOrchardHost>();
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<string, string> switches) {
try {
var host = _hostContainer.Resolve<IOrchardHost>();
tenant = tenant ?? "Default";
// Find tenant (or default)
tenant = tenant ?? "default";
var tenantManager = _hostContainer.Resolve<IShellSettingsManager>();
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<ICommandManager>().Execute(parameters);
}
var parameters = new CommandParameters {
Arguments = args,
Switches = switches,
Input = input,
Output = output
};
env.Resolve<ICommandManager>().Execute(parameters);
return 0;
}
@@ -95,6 +96,19 @@ namespace Orchard.Commands {
}
}
public IStandaloneEnvironment FindOrCreateTenant(string tenant) {
if (!_tenants.ContainsKey(tenant)) {
var host = _hostContainer.Resolve<IOrchardHost>();
var tenantManager = _hostContainer.Resolve<IShellSettingsManager>();
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);