mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-14 19:04:51 +08:00
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:
@@ -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);
|
||||
|
Reference in New Issue
Block a user