mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +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,8 +17,9 @@ namespace Orchard.Commands {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class CommandHostAgent {
|
public class CommandHostAgent {
|
||||||
private IContainer _hostContainer;
|
private IContainer _hostContainer;
|
||||||
|
private Dictionary<string, IStandaloneEnvironment> _tenants;
|
||||||
|
|
||||||
public int RunSingleCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary<string,string> switches) {
|
public int RunSingleCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary<string, string> switches) {
|
||||||
int result = StartHost(input, output);
|
int result = StartHost(input, output);
|
||||||
if (result != 0)
|
if (result != 0)
|
||||||
return result;
|
return result;
|
||||||
@@ -33,6 +34,7 @@ namespace Orchard.Commands {
|
|||||||
public int StartHost(TextReader input, TextWriter output) {
|
public int StartHost(TextReader input, TextWriter output) {
|
||||||
try {
|
try {
|
||||||
_hostContainer = OrchardStarter.CreateHostContainer(MvcSingletons);
|
_hostContainer = OrchardStarter.CreateHostContainer(MvcSingletons);
|
||||||
|
_tenants = new Dictionary<string, IStandaloneEnvironment>();
|
||||||
|
|
||||||
var host = _hostContainer.Resolve<IOrchardHost>();
|
var host = _hostContainer.Resolve<IOrchardHost>();
|
||||||
host.Initialize();
|
host.Initialize();
|
||||||
@@ -50,8 +52,12 @@ namespace Orchard.Commands {
|
|||||||
|
|
||||||
public int StopHost(TextReader input, TextWriter output) {
|
public int StopHost(TextReader input, TextWriter output) {
|
||||||
try {
|
try {
|
||||||
//
|
foreach (var tenant in _tenants.Values) {
|
||||||
|
tenant.Dispose();
|
||||||
|
}
|
||||||
_hostContainer.Dispose();
|
_hostContainer.Dispose();
|
||||||
|
|
||||||
|
_tenants = null;
|
||||||
_hostContainer = null;
|
_hostContainer = null;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -66,23 +72,18 @@ namespace Orchard.Commands {
|
|||||||
|
|
||||||
public int RunCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary<string, string> switches) {
|
public int RunCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary<string, string> switches) {
|
||||||
try {
|
try {
|
||||||
var host = _hostContainer.Resolve<IOrchardHost>();
|
tenant = tenant ?? "Default";
|
||||||
|
|
||||||
// Find tenant (or default)
|
var env = FindOrCreateTenant(tenant);
|
||||||
tenant = tenant ?? "default";
|
|
||||||
var tenantManager = _hostContainer.Resolve<IShellSettingsManager>();
|
|
||||||
var tenantSettings = tenantManager.LoadSettings().Single(s => String.Equals(s.Name, tenant, StringComparison.OrdinalIgnoreCase));
|
|
||||||
|
|
||||||
// Disptach command execution to ICommandManager
|
|
||||||
using (var env = host.CreateStandaloneEnvironment(tenantSettings)) {
|
|
||||||
var parameters = new CommandParameters {
|
var parameters = new CommandParameters {
|
||||||
Arguments = args,
|
Arguments = args,
|
||||||
Switches = switches,
|
Switches = switches,
|
||||||
Input = input,
|
Input = input,
|
||||||
Output = output
|
Output = output
|
||||||
};
|
};
|
||||||
|
|
||||||
env.Resolve<ICommandManager>().Execute(parameters);
|
env.Resolve<ICommandManager>().Execute(parameters);
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
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) {
|
protected void MvcSingletons(ContainerBuilder builder) {
|
||||||
builder.RegisterInstance(ControllerBuilder.Current);
|
builder.RegisterInstance(ControllerBuilder.Current);
|
||||||
builder.RegisterInstance(RouteTable.Routes);
|
builder.RegisterInstance(RouteTable.Routes);
|
||||||
|
Reference in New Issue
Block a user